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()/を使用しないでください。blobとしてeval()保存する場合は、 /chineseを使用できます。@thebjornによって提案された使用:json.dumps()json.loads() 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

求めている機能はTypeDecoratorhttp://docs.sqlalchemy.org/en/rel_0_7/core/types.html#sqlalchemy.types.TypeDecorator)にあります。たとえば、次のサブクラスを作成する必要があります。それを機能させるためのリスト)。

しかし、あなたがやろうとしているのは、英語の単語アートの2つの異なる翻訳を保存することです(少なくとも、それはgoogletranslateが私に言っていることです:-)。それらをコンマ区切りのリストとしてテキストフィールドに保存することは、最初の通常の形式ではありません。2つのレコードを保存する必要があります

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

これを可能にするためにデータベース構造を変更します。

于 2012-08-11T13:44:07.067 に答える
0

問題は、リストの文字列化が期待どおりに機能しないことです(私の投稿からの結論)。中国語の単語をデータベースに保存str(word.chinese)する代わりに、u''.join(word.chinese)データベースに値を文字列として作成して保存することができます。

于 2012-08-11T13:40:44.467 に答える
0

モデルの属性の1つで文字列/リストとの間で見苦しい操作を実行するのではなく、データスキーマをもう少し改良したいと思うかもしれません。

それぞれが1つ以上の「中国語」を持つことができると想定していengます。その場合、代わりに1対多の関係と2つのテーブル/マップされたオブジェクトが必要です。

コードが大幅にクリーンになります。

eval文字列を作成するのは本当に悪い考えです。いつも。

于 2012-08-11T14:01:53.923 に答える
0

これは、新しい答えに値する古い質問です。

2022年の時点で、次の回答に示すように、sqlalchemyのMutableListを使用できます。https://stackoverflow.com/a/64356997/2719980

于 2022-02-09T14:38:32.893 に答える