问题描述
我正在构建一个API,希望最终用户能够提前知道给定元素的ID,而不必先查询以发现ID。
最初,我使用自动递增ID来构建表格:
class Hardware(Base):
id = Column(Integer,primary_key=True,index=True)
serial_number = Column(String,index=True)
description = Column(String)
part_number = Column(String)
model_number = Column(String)
name = Column(String)
hostname = Column(String)
chassis_id = Column(Integer,ForeignKey("hardware.id"))
account_id = Column(Integer)
frus = relationship("Hardware")
__table_args__ = (UniqueConstraint('serial_number','part_number'),)
然后,我更改了主键,但是由于serial_number不是唯一的,因此我需要使用复合主键。就我而言,serial_number + part_number是唯一的。所以我试图创建这样的类:
class Hardware(Base):
serial_number = Column(String,index=True)
part_number = Column(String,primary_key=True)
description = Column(String)
model_number = Column(String)
name = Column(String)
hostname = Column(String)
account_id = Column(Integer)
__table_args__ = (
UniqueConstraint('serial_number','part_number')
)
这也可以。但是,当使用复合外键添加自引用外键(“ frus”)时,会收到错误消息。
我的桌子:
class Hardware(Base):
serial_number = Column(String,primary_key=True)
description = Column(String)
model_number = Column(String)
name = Column(String)
hostname = Column(String)
chassis_serial_number = Column(String,ForeignKey("hardware.chassis_serial_number"))
chassis_part_number = Column(String,ForeignKey("hardware.chassis_part_number"))
account_id = Column(Integer)
frus = relationship("Hardware")
__table_args__ = (
UniqueConstraint('serial_number',# UniqueConstraint('chassis_serial_number','chassis_part_number'),ForeignKeyConstraint(['chassis_serial_number','chassis_part_number'],['hardware.serial_number','hardware.part_number'])
)
我收到的错误:
sqlalchemy.exc.ProgrammingError: (psycopg2.errors.InvalidForeignKey) there is no unique constraint matching given keys for referenced table "hardware"
[sql:
CREATE TABLE hardware (
_created TIMESTAMP WITHOUT TIME ZONE,_modified TIMESTAMP WITHOUT TIME ZONE,serial_number VARCHAR NOT NULL,part_number VARCHAR NOT NULL,description VARCHAR,model_number VARCHAR,name VARCHAR,hostname VARCHAR,chassis_serial_number VARCHAR,chassis_part_number VARCHAR,account_id INTEGER,PRIMARY KEY (serial_number,part_number),FOREIGN KEY(chassis_serial_number,chassis_part_number) REFERENCES hardware (chassis_serial_number,chassis_part_number),UNIQUE (serial_number,part_number)
)
]
如何结合使用复合主键和自引用外键?此时,我正在考虑仅对serial_number + part_number进行哈希处理,而不是使用复合外键。
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)