У меня есть установка отношения многие ко многим, объединяющая строки из одной таблицы.
Ниже приведена упрощенная схема:
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')
})
Вот где ошибка возникает с моей настройкой оракула:
parentRun = session.query(Run).filter_by(runId=4).first()
childRun = Run(status='queued', parents=[parentRun])
session.add(childRun)
session.commit() # Error occurs here
Я не уверен, почему,но соединитель Oracle упаковывает childRun в список перед вставкой в таблицу Runs_Runs.
Среда:
- macOs 10.13.6
- Python 2.7.14
- SQLAlchemy 1.2.9
- cx-Oracle 7.0.0 (libclntsh.dylib.12.1)