Типы данных nvarchar и ntext несовместимы в операторе равенства. (402) (SQLExecDirectW) ') ||SqlAlchemy, Sql Azure - PullRequest
1 голос
/ 02 ноября 2019

Версия БД: Microsoft SQL Azure (окончательная первоначальная версия) - 12.0.2000.8 12 октября 2019 22:46:48 Copyright (C) 2019 Microsoft Corporation

У меня есть модель sqlalchemy-orm Process, как указано ниже.

class Process(Base):
    __tablename__ = 'Process'
    id = Column(Integer, primary_key=True, autoincrement=True)
    process = Column(UnicodeText)
    process_length = Column(Integer)

Я пытаюсь выполнить следующий запрос, чтобы найти строку, в которой процесс соответствует строке sorted_json.

current_process = session.query(Process).filter(Process.process==sorted_json).one_or_none()

Этот запрос приводит к ошибке:

ProgrammingError: (pyodbc.ProgrammingError) ('42000', '[42000] [Microsoft][ODBC Driver 17 for SQL Server][SQL Server]The data types nvarchar and ntext are incompatible in the equal to operator. (402) (SQLExecDirectW)')

Я попытался изменить тип данных столбца process на ntext в серверной части. Когда я запускаю запрос, он выдает странную ошибку:

ProgrammingError: (pyodbc.ProgrammingError) ('42000', '[42000] [Microsoft][ODBC Driver 17 for SQL Server][SQL Server]The data types ntext and ntext are incompatible in the equal to operator. (402) (SQLExecDirectW)')

Следует отметить, что sorted_json - это очень длинная строка json , содержащая около 4000 символов. Я полагаю, что sqlalchemy преобразует эту строку в ntext при выполнении запросов.

Вместо этого я попробовал подобную функцию sqlalchemy, например:

current_process = session.query(Process).filter(Process.process.like(sorted_json)).one_or_none()

Здесь нет ошибок, но при фактическом совпадении он не соответствует.

Любойпомощь приветствуется!

1 Ответ

1 голос
/ 02 ноября 2019

Проблема была частично решена путем приведения строки sorted_json к NVARCHAR в запросе orm, например:

from sqlalchemy import cast, NVARCHAR
session.query(Process).filter(Process.process==cast(sorted_json,NVARCHAR)).one_or_none()

Как уже упоминалось @GordThomson, проблема находится на стороне драйвера odbc. Проблема упоминается здесь: github.com/mkleehammer/pyodbc/issues/620

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