我有一个多对多关系设置,它将同一张表中的行连接在一起。
下面是一个简化的模式:
Runs:
- status
Run_Runs:
- parentRunId
- childRunId
我想实例化一个新的孩子跑步并设置其父母。对sqlite(应用程序内安装)或外部postgres数据库执行此操作可以正常进行。针对Oracle数据库运行此命令时,出现以下错误:
sqlalchemy.exc.StatementError:(exceptions.TypeError)float()参数 必须为字符串或数字[SQL:u'IN SERT INTO示例。“ Runs_Runs” (“ parentRunId”,“ childRunId”)值(:parentRunId,:childRunId)'] [参数:[{'parentRunId':4.0,'childRunId':[634.0]}] ]
下面是mapper
设置的摘要。可在此gist上找到工作示例。
runJoinTable = tables['Runs_Runs']
runTable = tables['Runs']
saOrm.mapper(Run, runTable, version_id_col=runTable.columns.revision,
properties={
"children": saOrm.relationship(Run,
secondary=runJoinTable,
primaryjoin = runTable.c.runId == runJoinTable.c.parentRunId,
secondaryjoin = runTable.c.runId == runJoinTable.c.childRunId,
backref='parents')
})
这是我的Oracle设置发生错误的地方:
parentRun = session.query(Run).filter_by(runId=4).first()
childRun = Run(status='queued', parents=[parentRun])
session.add(childRun)
session.commit() # Error occurs here
我不确定为什么,但是在插入Runs_Runs表之前,Oracle连接器将childRun包装在列表中。
环境:
答案 0 :(得分:0)
通过更新为SqlAlchemy版本1.3.0b1来解决。
由于1.2.12发生在cx_Oracle 7.0中,因此它似乎实际上已经固定在this issue上。
显然,ID是作为具有特定cx_Oracle版本的列表返回的。根据变更日志:
Oracle param.getvalue()现在返回一个列表,而不是单个列表 标量值,破坏了整个Core和ORM的自动递增逻辑