2015-05-23 79 views
2
class A(Base): 
    __tablename__ = 'a' 

    id = Column(Integer, primary_key=True) 
    name = Column(String(1000)) 

class B(Base): 
    __tablename__ = 'b' 

    id = Column(Integer, primary_key=True) 
    name = Column(String(1000)) 

class C(Base): 
    __tablename__ = 'c' 

    id = Column(Integer, primary_key=True) 
    b_id = Column(Integer, ForeignKey('b.id')) 
    name = Column(String(1000)) 
    a_id = Column(Integer, ForeignKey('a.id')) 

    b = relationship('B', backref=backref('cb'), foreign_keys = b_id) 
    a = relationship('A', backref=backref('ca'), foreign_keys = a_id) 

connect = engine.connect() 
Base.metadata.create_all(bind=engine) 

我創建的類創建表,並與SQLAlchemy的將數據添加到MySQL數據庫的發揮。我現在面臨的問題如下。添加相關數據到MySQL數據庫SQLAlchemy的

如果我想添加一個條目到表c我所需要的就是這樣的代碼。

c_ent = C(name = 'c1') 
a1 = A(name = 'a1') 
b1 = B(name = 'b1') 

a1.ca = [c_ent] 
b1.cb = [c_ent] 

list1 = [a1, b1] 

sess = create_session(name) 
for i in list1: 
    sess.add(i) 

sess.commit() 
sess.close() 

這一切工作我需要它的方式和在c入口B_ID和A_ID外鍵匹配相應的ID的A和B。

但是,假設在提交數據庫並關閉會話後,我現在決定向c'c2'添加另一個條目。我希望這個條目與我的第一個表有相同的關係(以便a_id和b_id與名爲'c1'的條目相同)。但是,如果我使用類似於第一個條目的代碼,sqlalchemy將在表a和b中創建重複條目,名稱爲'a1'和'b1',其id編號爲2而不是1.然後,我在表c中的條目將有正確的身份證號碼,但他們將被鏈接到重複的條目。

我希望能夠向c中添加一個條目,然而我多次選擇並將它與表a和b關聯,而無需每次都在a和b中創建新條目。我怎樣才能避免這種冗餘?

回答

1

嘗試做這樣:

c2 = C(name='c2') 
c2.a = a1 
c2.b = b1 

sess = create_session(name) 
sess.add(c2) 
sess.commit() 
sess.close() 

與使用SQLite全碼:

from sqlalchemy.ext.declarative import declarative_base 
from sqlalchemy import Column, Integer, String, ForeignKey, create_engine 
from sqlalchemy.orm import relationship, backref, sessionmaker 


Base = declarative_base() 


class A(Base): 
    __tablename__ = 'a' 

    id = Column(Integer, primary_key=True) 
    name = Column(String(1000)) 


class B(Base): 
    __tablename__ = 'b' 

    id = Column(Integer, primary_key=True) 
    name = Column(String(1000)) 


class C(Base): 
    __tablename__ = 'c' 

    id = Column(Integer, primary_key=True) 
    b_id = Column(Integer, ForeignKey('b.id')) 
    name = Column(String(1000)) 
    a_id = Column(Integer, ForeignKey('a.id')) 

    b = relationship('B', backref=backref('cb'), foreign_keys=b_id) 
    a = relationship('A', backref=backref('ca'), foreign_keys=a_id) 

engine = create_engine('sqlite:////tmp/temp.db') 

connect = engine.connect() 
Base.metadata.create_all(bind=engine) 

Session = sessionmaker(bind=engine) 
sess = Session() 

c_ent = C(name='c1') 
a1 = A(name='a1') 
b1 = B(name='b1') 

a1.ca = [c_ent] 
b1.cb = [c_ent] 

list1 = [a1, b1] 

for i in list1: 
    sess.add(i) 
sess.commit() 

c2 = C(name='c2') 
c2.a = a1 
c2.b = b1 
sess.add(c2) 
sess.commit() 

sess.close() 

執行後:

$ sqlite3 /tmp/temp.db 
SQLite version 3.8.2 2013-12-06 14:53:30 
Enter ".help" for instructions 
Enter SQL statements terminated with a ";" 
sqlite> SELECT * FROM c; 
1|1|c1|1 
2|1|c2|1 
sqlite> SELECT * FROM a; 
1|a1 
sqlite> SELECT * FROM b; 
1|b1 

正如你所看到的,沒有重複數據的。表a中只有一個條目,表b中只有一個條目。

+0

此方法仍然有與原始問題相同的問題,但感謝您試圖幫助 –

+0

而這個問題在哪裏?你的問題是創建新的條目。在我的代碼中,我沒有創建A和B的新條目,我只使用了你已有的條目。 –

+0

對不起,我可能還不夠具體。我並不擔心在我的代碼中有新的條目,而是由實際數據庫中的代碼創建的新條目。 –