1

我正在尝试使用基于 sql alchemy 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 的客户创建两个行对象

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()

我想知道我没有做什么绕过外键强制执行

提前致谢

4

2 回答 2

3

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

于 2013-05-23T05:22:16.050 回答
0

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

于 2013-05-23T10:26:10.490 回答