sqlalchemy不强制执行外键约束

时间:2013-05-23 04:46:29

标签: python sqlalchemy

我正在尝试使用基于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和3
auth1 = 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()

我想知道我没做什么绕过了外键执行

提前致谢

2 个答案:

答案 0 :(得分:3)

SQLite负责执行约束,而不是SQLAlchemy。出于向后兼容性原因,SQLite需要一个特殊参数来启用外键的强制执行。请参阅此问题的答案:Sqlite / SQLAlchemy: how to enforce Foreign Keys?

答案 1 :(得分:0)

正如我发现的那样,@ jd指出上面的问题可能与sqlite有关。我将我的数据库引擎更改为mysql,它的工作正常。所以我向sqlalchemy粉丝道歉,因为我直接指着sqlalchemy。 :-)