sqlalchemy-具有自引用外键的复合主键

问题描述

我正在构建一个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 (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...