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

2024-04-18 22:05:14 发布

您现在位置:Python中文网/ 问答频道 /正文

简短的代码如下:

    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()

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


Tags: 对象key代码truebasestringsessioncolumn
3条回答

你会在TypeDecoratorhttp://docs.sqlalchemy.org/en/rel_0_7/core/types.html#sqlalchemy.types.TypeDecorator)中找到你想要的功能——你需要创建一个list的子类来让它工作。

但是,你要做的是存储两个不同的英语单词艺术翻译(至少google translate告诉我的是:-)。在文本字段中将它们存储为逗号分隔的列表并不是第一种正常形式。你应该存两张唱片

('art', u'艺术')
('art', u'美术')

并更改数据库结构以允许此操作。

问题是串列表并没有如你所期望的那样工作(我的结论来自你的文章)。您可以将中文单词存储在数据库中,只需将str(word.chinese)改为u''.join(word.chinese),并将值作为字符串存储在数据库中。

要在数据库中存储列表,可以使用新表:

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

full example

不要使用str()/eval()如果您想将chinese存储为blob,您可以使用json.dumps()/json.loads()。使用由@thebjornTypeDecorator建议的:

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))

full example

相关问题 更多 >