Ошибка SQLAlchemy ProgrammingError при вставке в таблицу postgresql 11 - PullRequest
0 голосов
/ 11 октября 2019

Я не могу вставить данные с использованием SQLAlchemy (v1.3.10) в таблицу postgresql 11. Я впервые заметил ошибку при запуске некоторого старого кода, который ранее работал с SQLAlchemy (v1.2.10) и posgresql 11. Я обновил обе версии в своем проекте некоторое время назад, но до сих пор не проверял часть базы данных моей базы кода(виноват). База кода относительно велика, поэтому, к сожалению, я не совсем уверен, что еще могло измениться, чтобы вызвать эту проблему. Я попытался понизить sqlalchemy и psycopg2 до предыдущих версий, но это не решило проблему. К сожалению, возврат к postgresql 10 более сложен, поэтому я хотел бы избежать этого, если это возможно.

Ошибка впервые возникла при попытке вставить объект модели ORM, но я получаю ту же ошибку при попытке вставить с помощьюAPI выражения и даже с необработанными инструкциями SQL. Я создал очень простую таблицу:

create table test_table(
  id integer not null primary key;
);

и создал сеанс, используя рецепт Getting Session с менеджером контекста (ниже на странице). При выполнении этого кода:

stmt = text("insert into nba.test_table(id) values (:id)")
values = {'id': 3}
session.execute(stmt, values)

я получаю следующую трассировку стека:

Traceback (most recent call last):
  File "/usr/lib64/python3.6/unittest/case.py", line 59, in testPartExecutor
    yield
  File "/usr/lib64/python3.6/unittest/case.py", line 605, in run
    testMethod()
  File "/home/reid/git/worthy/test/test_db.py", line 32, in test_insert
    session.execute(stmt, values)
  File "/home/reid/git/worthy/.venv/lib64/python3.6/site-packages/sqlalchemy/orm/session.py", line 1269, in execute
    clause, params or {}
  File "/home/reid/git/worthy/.venv/lib64/python3.6/site-packages/sqlalchemy/engine/base.py", line 988, in execute
    return meth(self, multiparams, params)
  File "/home/reid/git/worthy/.venv/lib64/python3.6/site-packages/sqlalchemy/sql/elements.py", line 287, in _execute_on_connection
    return connection._execute_clauseelement(self, multiparams, params)
  File "/home/reid/git/worthy/.venv/lib64/python3.6/site-packages/sqlalchemy/engine/base.py", line 1107, in _execute_clauseelement
    distilled_params,
  File "/home/reid/git/worthy/.venv/lib64/python3.6/site-packages/sqlalchemy/engine/base.py", line 1253, in _execute_context
    e, statement, parameters, cursor, context
  File "/home/reid/git/worthy/.venv/lib64/python3.6/site-packages/sqlalchemy/engine/base.py", line 1473, in _handle_dbapi_exception
    util.raise_from_cause(sqlalchemy_exception, exc_info)
  File "/home/reid/git/worthy/.venv/lib64/python3.6/site-packages/sqlalchemy/util/compat.py", line 398, in raise_from_cause
    reraise(type(exception), exception, tb=exc_tb, cause=cause)
  File "/home/reid/git/worthy/.venv/lib64/python3.6/site-packages/sqlalchemy/util/compat.py", line 152, in reraise
    raise value.with_traceback(tb)
  File "/home/reid/git/worthy/.venv/lib64/python3.6/site-packages/sqlalchemy/engine/base.py", line 1249, in _execute_context
    cursor, statement, parameters, context
  File "/home/reid/git/worthy/.venv/lib64/python3.6/site-packages/sqlalchemy/engine/default.py", line 580, in do_execute
    cursor.execute(statement, parameters)
sqlalchemy.exc.ProgrammingError: (psycopg2.errors.SyntaxError) syntax error at or near "insert"
LINE 1: ...ECLARE "c_7fbd3ae7c8d0_1" CURSOR WITHOUT HOLD FOR insert int...
                                                             ^

[SQL: insert into nba.test_table(id) values (%(id)s)]
[parameters: {'id': 3}]
(Background on this error at: http://sqlalche.me/e/f405)

Трассировка стека практически идентична, использую ли я необработанный SQL-запрос, запрос, построенный с использованием sqlalchemyвыражение api, или используя класс модели, сопоставленный с API-интерфейсом ORM.

Я могу просто запросить таблицы, и если я выполню эквивалентный запрос, используя модуль psycopg2 напрямую, у меня не возникнет проблем при вставке данных.

1 Ответ

0 голосов
/ 11 октября 2019

Существует небольшая разница в том, как я создал свой движок, чем рецепт, приведенный в ссылке выше.

По ссылке это:

some_engine = create_engine('postgresql://scott:tiger@localhost/')

Где, как я включилдополнительный аргумент

some_engine = create_engine('postgresql://scott:tiger@localhost/', execution_options={'stream_results': True})

При удалении аргумента execution_options все снова работает.

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