2012-08-11 64 views
3

簡要代碼是這樣的:使用Python的SQLAlchemy商店列表到SQL數據庫

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來存儲我的對象,我不知道要在哪裏更改以達到我的目標...

回答

7

要存儲列表中一個數據庫,你可以使用一個新表:

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

,如果你想存儲chinese,你可以使用json.dumps()/json.loads()一個blob不要使用str()/eval()。使用建議的@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

+0

這與實際問題的非常好的答案無關,只是在'Word.eng'上具有'unique = True'的評論將阻止您爲同形異義詞存儲不同的翻譯(例如'live' - 韻'give'和'live' - 與'dive'押韻)。當語言A中的兩個單獨的概念映射到語言B中的單一概念時,例如,德語essen/fressen - >吃(取決於主題),法語知識/connaître - >知道(取決於對象),英語屋頂/天花板 - > tak [挪威語](取決於...)等。自然語言翻譯很難;-) – thebjorn 2013-09-08 10:22:03

+0

@thebjorn:'單詞。在這個問題中,「eng」是隱含唯一性的主要關鍵。不管它,我已經使用[**一對多關係](http://docs.sqlalchemy.org/en/latest/orm/relationships.html#one-to-many)而不是[** many許多**](http://docs.sqlalchemy.org/en/latest/orm/relationships.html#many-to-many)(你所描述的),以避免複雜的演示如何存儲在數據庫中列表。 Sqlalchemy支持它,如果你需要它。 – jfs 2013-09-08 15:51:07

0

問題是字符串化列表不能正常工作(我的結論來自您的文章) 。您可以將中文單詞存儲在數據庫中,而不是str(word.chinese),製作u''.join(word.chinese)並以字符串形式存儲數據庫中的值。

4

您可以在TypeDecoratorhttp://docs.sqlalchemy.org/en/rel_0_7/core/types.html#sqlalchemy.types.TypeDecorator - 您必須創建例如列表的子類才能使其工作)中找到所需的功能。

然而,你想要做的是存儲兩個不同的英文單詞藝術翻譯(至少這是谷歌翻譯告訴我:-)。將它們作爲逗號分隔的列表存儲在文本字段中不是第一種正常形式。您應該存儲兩條記錄

('art', u'藝術') 
('art', u'美術') 

並更改您的數據庫結構以支持此操作。

0

我想你可能想要改進一點你的數據模式,而不是在你的模型屬性之一中對字符串/列表進行難看的操作。

我假設每個eng可以有一個或多個'chinese',在這種情況下,您需要1到多個relationship和兩個表/映射對象。

你的代碼將顯着更清潔。

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