尝试在SQLAlchemy中重用主键id时出现问题

问题描述

|| 我正在尝试使用SQLAlchemy重用我的一个表中的主键,并收到外键约束错误。 简而言之: PostgreSQL 8.4 Python 2.7 SQLAlchemy 0.7 我有3个表格:用户,库存和设备。库存和设备与用户具有一对一的关系。 User.id是Inventories.user_id,而Devices.user_id是外键。 我已经按照标准python惯例在模型/中设置了用户,设备和库存。 在交互式python中,我可以发出以下命令没问题:
>>>newUser = User.create()
>>>newUser.device = User.create_device(<*args>)
>>>Session.add(newUser)
>>>Session.commit()
(库存记录是通过代码自动创建的) 现在,假设我要重复使用用户记录1(出于安全和内部测试原因,这是唯一允许在代码中调用reset方法的记录)
>>>oldUser = User.retrieve(1)
>>>Session.delete(oldUser)
>>>Session.commit()
(确认用户1不再存在)
>>>newUser = User.create()
>>>newUser.device = User.create_device(<*args>)
>>>newUser.id = 1
>>>Session.add(newUser)
>>>Session.commit()
此时,我将得到一个错误,即仍从表\“ devices \”(或\“ inventories \”)中引用Key(id)=(
<id>
),其中
<id>
是newUser.id,然后重新分配它成为ID 1 我研究了级联,并尝试了各种选项(全部,保存更新等),但没有任何效果。 任何指向我要去哪里的信息将不胜感激, 谢谢, 克里斯     

解决方法

        要解决您所看到的错误,可以在提交之前更新与该
User
模型关联的所有
Device
Inventory
模型上的外键。您必须确保您的
User
模型不会自动增加ID(即,它不是PostgreSQL序列)。 例如,SQLAlchemy模型声明应为
class User(base):
    __tablename__ = \'user\'
    id = Column(\'id\',Integer,primary_key=True,unique=True,nullable=False)
代替
class User(base):
    __tablename__ = \'user\'
    id = Column(\'id\',Sequence(\'user_id_seq\'),primary_key=True)
但是,这可能不是正确的方法!最好在
User.id
上使用一个序列(如第二个模型声明中的序列),并在用户表上添加另一个字段以指示用户是否是管理员(出于您提到的安全性/测试目的)。这样,您不必依靠应用程序中的幻数(例如,用户ID)来获取应用程序逻辑,尤其是安全性。     ,        我可能没有使用SQLAlchemy,所以我没有正确的答案,但是我可以说,您必须问自己想要什么是真的必要吗? 因为, 您可能会破坏数据完整性,这可能会引起严重的问题。 您将需要破坏ID的自动递增结构,因此在此之前,您必须手动分配ID,或使用手写的预保存触发器来获取正确的ID。 如果您的表中有一个用户foreginkey设置NOT为null,那么释放与已删除用户相关的记录可能会遇到问题。如果不将其为空,则重复使用的ID将产生严重的数据完整性问题(错误引用关系)... 因此,首先,您必须决定是否值得?     ,        由于这是在生产中不应该看到的问题,因此只需使用
SET CONSTRAINTS
。您可以在ѭ14上使用
INITIALLY DEFERRED
,但是我不建议您这样做,因为您没有处理生产中存在的循环依赖关系。     

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...