2015-05-23 49 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

对不起,我可能还不够具体。我并不担心在我的代码中有新的条目,而是由实际数据库中的代码创建的新条目。 –