SqlAlchemy Oracle StatementError при добавлении в список «многие ко многим» - PullRequest
0 голосов
/ 21 декабря 2018

У меня есть установка отношения многие ко многим, объединяющая строки из одной таблицы.

Ниже приведена упрощенная схема:

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)

1 Ответ

0 голосов
/ 24 декабря 2018

Исправлено обновлением до версии SqlAlchemy 1.3.0b1 .

Похоже, что на самом деле это могло быть исправлено на 1.2.12 из-за этой проблемы, что произошло с cx_Oracle 7.0.

Идентификаторы, очевидно, возвращались в виде списка с этой конкретной версией cx_Oracle.Согласно журналу изменений:

Oracle param.getvalue () теперь возвращает список, а не одно скалярное значение, нарушая логику автоинкремента во всем ядре и ORM

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...