SQLAlchemy设置字符串主键直接插入报id()参数错误是什么原因?
错误产生原因
- 核心报错来自
relationship配置的order_by参数:你代码中写的order_by=id,但当前Unix模型内未定义名为id的字段,此处的id被解析为Python内置的id()函数。SQLAlchemy后续解析排序规则时会尝试调用该对象获取排序依据,未传入参数就触发了TypeError: id() takes exactly one argument (0 given)错误,该错误会影响所有依赖SQLAlchemy模型解析的操作,所以其他模型也会抛出异常。 - 关联属性赋值写法错误:
unix.code(code)的写法不生效,relationship定义的code是属性不是可调用方法,需要直接赋值。
修复方案
- 修正
order_by配置:如果需要按Unix表的accession主键排序,将参数改为order_by=accession;如果需要按关联的Code表的id排序,改为order_by='Code.id'即可。 - 修正关联属性赋值逻辑,将调用写法改为直接赋值
unix.code = code。 - 你当前定义字符串类型主键的写法没有问题,只要插入时显式传入
accession的值即可正常写入,不需要额外配置主键生成规则。
修复后的模型示例
class Unix(Base): __tablename__ = 'unix' accession = Column('accession', String, primary_key=True) code_id = Column(BIGINT, ForeignKey('code.id')) # 此处示例按accession排序,可根据业务需求调整排序字段 code = relationship('Code', backref=backref('unix', order_by=accession)) def __init__(self, accession): self.accession = accession
修复后的业务代码示例
unix = Unix(accession='asd') unix.code = code self.session.add(unix) self.session.commit()
内容的提问来源于stack exchange,提问作者Hyungsik Jo
相关产品推荐
相关产品推荐

