5

简短的代码是这样的:

    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 来存储我的对象,我想知道在哪里改变以达到我的目标......

4

5 回答 5

9

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

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

查看完整示例

不要使用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))

查看完整示例

于 2012-08-11T14:30:48.010 回答
4

TypeDecorator您将在(http://docs.sqlalchemy.org/en/rel_0_7/core/types.html#sqlalchemy.types.TypeDecorator中找到您要求的功能- 您必须创建例如列表让它工作)。

但是,您要做的是为英语艺术字存储两种不同的翻译(至少这是 google translate 告诉我的 :-)。将它们作为逗号分隔的列表存储在文本字段中不是第一个标准形式。您应该存储两条记录

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

并更改您的数据库结构以允许这样做。

于 2012-08-11T13:44:07.067 回答
0

我认为您可能希望进一步改进您的数据模式,而不是对模型属性之一中的字符串/列表执行难看的操作。

我假设每个人都eng可以有 1 个或多个“中文”,在这种情况下,您需要一个一对多的关系和两个表/映射对象。

你的代码会更干净。

eval'ing 字符串只是一个非常糟糕的主意。总是。

于 2012-08-11T14:01:53.923 回答
0

问题是字符串化列表没有像你预期的那样工作(我从你的帖子中得出的结论)。您可以将中文单词存储在数据库中,而不是作为字符串在数据库中生成和存储值str(word.chinese)u''.join(word.chinese)

于 2012-08-11T13:40:44.467 回答
0

这是一个老问题,值得更新答案。

截至 2022 年,您可以使用 sqlalchemy 中的 MutableList,如以下答案所示:https://stackoverflow.com/a/64356997/2719980

于 2022-02-09T14:38:32.893 回答