添加到多对多列表时,SqlAlchemy Oracle StatementError

时间:2018-12-20 22:40:25

标签: python oracle sqlalchemy

我有一个多对多关系设置,它将同一张表中的行连接在一起。

下面是一个简化的模式:

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包装在列表中。

环境:

  • macOs 10.13.6
  • Python 2.7.14
  • SQLAlchemy 1.2.9
  • cx-Oracle 7.0.0(libclntsh.dylib.12.1)

1 个答案:

答案 0 :(得分:0)

通过更新为SqlAlchemy版本1.3.0b1来解决。

由于1.2.12发生在cx_Oracle 7.0中,因此它似乎实际上已经固定在this issue上。

显然,ID是作为具有特定cx_Oracle版本的列表返回的。根据变更日志:

  

Oracle param.getvalue()现在返回一个列表,而不是单个列表   标量值,破坏了整个Core和ORM的自动递增逻辑