2

我正在尝试映射一个看起来像这样的对象:

    self.user = {lots of stuff in here}
    self.timeStamp = i am a date object
    self.coordinates  = {lots of stuff in here}
    self.tweet = {lots of stuff in here}

    self.favourite = 0
    self.reTweet = 0

非字典似乎很容易映射

__tablename__ = 'Tweet'
id = Column(Integer, primary_key=True)
timeStamp = Column(DateTime)
favourite = Column(Integer)
reTweet = Column(Integer)

但是我不知道如何映射字典对象。理想情况下,这些对象应该小心地进入自己的表,所以我们遵守第三范式。但是我不知道从哪里开始。有人可以指出我正确的方向吗?我应该把这些字典变成自己的对象并映射它们吗?

非常感谢

4

2 回答 2

3

对于存储字典对象,您有几个选项:

  • 使用文本字段,通过将您的字典写入其中json.dumps(value),使用从中读取json.loads(db_value)
  • 创建自己的 json类型,就像在这个线程中建议的那样:SQLAlchemy JSON as blob/text

    import jsonpickle
    import sqlalchemy.types as types
    
    class JsonType(types.MutableType, types.TypeDecorator):    
        impl = types.Unicode
    
        def process_bind_param(self, value, engine):
            return unicode(jsonpickle.encode(value))
    
        def process_result_value(self, value, engine):
            if value:
                return jsonpickle.decode(value)
            else:
                # default can also be a list
                return {}
    

而且,仅供参考,您很难遵循第三种范式,因为推文对象没有严格和定义的模式 - 将其存储在数据库字段中就可以了。

顺便说一句,我发现使用mongodb存储推文非常方便,因为它是无模式的并且存储 json 对象。

希望有帮助。

于 2013-08-07T20:10:56.760 回答
3

用户和坐标条目可以存储为单独的表,推文表将作为外键链接到这些表。就像是:

class Tweet(Base):
    __tablename__ = 'tweet'
    id = Column(Integer, Sequence('tweet_id_seq'), primary_key=True)
    user = Column(Integer, ForeignKey('user.id'))
    coords = Column(Integer, ForeignKey('coordinates.id'))
    timeStamp = Column(DateTime)
    favourite = Column(Integer)
    reTweet = Column(Integer)

class Coordinates(Base):
    __tablename__ = 'coordinates'
    id = Column(Integer, Sequence('coordinates_id_seq'), primary_key=True)
    lat = ...
    long = ...

class User(Base):
    __tablename__ = 'user'
    id = Column(Integer, Sequence('user_id_seq'), primary_key=True)
    name = ...
于 2013-08-07T20:06:53.700 回答