Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python sqlalchemy不强制外键约束_Python_Sqlalchemy - Fatal编程技术网

Python sqlalchemy不强制外键约束

Python sqlalchemy不强制外键约束,python,sqlalchemy,Python,Sqlalchemy,我正在尝试使用基于sql alchemy ORM的db定义。 我已将我的表定义如下 class Customer(Base): __tablename__ = 'customer' id = Column(Integer, primary_key=True) name = Column(String(80)) auth = relationship("CustomerAuth", backref='customer') class Custome

我正在尝试使用基于sql alchemy ORM的db定义。 我已将我的表定义如下

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()
我想知道绕过外键强制的我没有做什么


提前感谢

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

正如我发现的以及上面@jd所指出的,问题可能与sqlite有关。我把我的数据库引擎改成了mysql,它的工作状态和预期的一样好。因此,当我直指sqlalchemy时,我向sqlalchemy的粉丝们表示歉意。:-)

您使用的是什么RSBMS?MySQL和MyISAM表?我使用的是sqlite。我正在创建一个内存中的sqlite数据库,如下所示------从sqlalchemy导入create_engine=create_engine('sqlite://:memory:',echo=True)