sqlalchemy地图对象,包含dicts

时间:2013-08-07 19:57:51

标签: python dictionary sqlalchemy

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

    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)

但是我不知道如何映射字典对象。理想情况下,这些对象应该自行进入自己的表格,以便我们遵守第3范式。但是我不知道从哪里开始。有人能指出我正确的方向吗?我应该将这些词典转换成自己的对象并映射它们吗?

非常感谢

2 个答案:

答案 0 :(得分: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 = ...

答案 1 :(得分:2)

要存储字典对象,您有以下几种选择:

  • 使用Text字段,通过json.dumps(value)将字词写入其中,然后使用json.loads(db_value)
  • 读取该字词
  • 创建自己的json type,就像在此帖子中提到的那样: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对象。

希望有所帮助。