我正在尝试使用基于ORM的基于ORM的数据库定义。 我已按如下方式定义了表格
class Customer(Base):
__tablename__ = 'customer'
id = Column(Integer, primary_key=True)
name = Column(String(80))
auth = relationship("CustomerAuth", backref='customer')
class CustomerAuth(Base):
__tablename__ = 'authentication'
id = Column(Integer, ForeignKey('customer.id'))
username = Column(String(80), primary_key=True)
passwd = Column(String(80))
现在我正在创建会话
Session = sessionmaker(bind=sqla.engine)
session = Session()
然后我尝试为ID为1和2
的Customer创建两个行对象cst1 = sqla.Customer(id=1,name='shyam')
cst2 = sqla.Customer(id=2,name='ram')
我为CustomerAuth创建了三个行对象,它们引用了Customer
的id 1,2和3auth1 = sqla.CustomerAuth(id=1,username='shyamu',passwd='wam')
auth2 = sqla.CustomerAuth(id=2,username='ramu',passwd='dam')
auth3 = sqla.CustomerAuth(id=3,username='lamu',passwd='sam')
如您所见,我创建了一个id = 3的CustomerAuth行,这是一个引用Customer.id的外键。但由于Customer表没有id = 3的条目,因此这应该失败
session.add(cst1)
session.add(cst2)
session.add(auth1)
session.add(auth2)
session.flush()
此操作应该失败但成功完成。
session.add(auth3)
session.flush()
我想知道我没做什么绕过了外键执行
提前致谢
答案 0 :(得分:3)
SQLite负责执行约束,而不是SQLAlchemy。出于向后兼容性原因,SQLite需要一个特殊参数来启用外键的强制执行。请参阅此问题的答案:Sqlite / SQLAlchemy: how to enforce Foreign Keys?
答案 1 :(得分:0)
正如我发现的那样,@ jd指出上面的问题可能与sqlite有关。我将我的数据库引擎更改为mysql,它的工作正常。所以我向sqlalchemy粉丝道歉,因为我直接指着sqlalchemy。 :-)