python使用sqlalchemy将列表存储到sql数据库中

C19*_*C19 3 python sqlalchemy

简短的代码是这样的:

    class Word(Base):
        __tablename__ = 'word'
        eng                 = Column(String(32),primary_key=True)
        chinese             = Column(String(128))

word = Word(eng='art',chinese=[u'??',u'??'])
session.add(word)
session.commit()
Run Code Online (Sandbox Code Playgroud)

我正在尝试将word.chinese存储为字符串.在python中它是一个列表...好吧,当我自己编写sql时,我可以str(word.chinese)然后插入到数据库中.当需要得到它时,我可以简单地使用eval(result)来获取原始的python对象.但由于我使用sqlalchemy存储我的物体,我想知道在哪里改变以达到我的目标......

jfs*_*jfs 7

要在db中存储列表,您可以使用新表:

class Word(Base):
    __tablename__ = "words"

    id = Column(Integer, primary_key=True)
    eng = Column(String(32), unique=True)
    chinese = relationship("Chinese", backref="eng")

    def __init__(self, eng, chinese):
        self.eng = eng
        self.chinese = map(Chinese, chinese)

class Chinese(Base):
    __tablename__ = "chinese_words"

    word = Column(String(128), primary_key=True)
    eng_id = Column(Integer, ForeignKey('words.id'), primary_key=True)

    def __init__(self, word):
        self.word = word
Run Code Online (Sandbox Code Playgroud)

查看完整示例.

不要使用str()/ eval()如果你想存储chinese为blob你可以使用json.dumps()/ json.loads().使用@thebjorn 建议TypeDecorator:

class Json(TypeDecorator):

    impl = String

    def process_bind_param(self, value, dialect):
        return json.dumps(value)

    def process_result_value(self, value, dialect):
        return json.loads(value)

class Word(Base):
    __tablename__ = "words"

    eng = Column(String(32), primary_key=True)
    chinese = Column(Json(128))
Run Code Online (Sandbox Code Playgroud)

查看完整示例.