【问题标题】:The data types nvarchar and ntext are incompatible in the equal to operator. (402) (SQLExecDirectW)') || SqlAlchemy, Sql Azure数据类型 nvarchar 和 ntext 在等于运算符中不兼容。 (402) (SQLExecDirectW)') || SqlAlchemy, Sql Azure
【发布时间】:2020-02-28 12:38:25
【问题描述】:

数据库版本:Microsoft SQL Azure (RTM) - 12.0.2000.8 Oct 12 2019 22:46:48 版权所有 (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()

这里没有错误,但是当有实际匹配时它不提供匹配。

感谢任何帮助!

【问题讨论】:

  • 不要在 SQL Server 中将数据类型更改为ntext,该数据类型已弃用 14 年,应避免使用。它的功能比nvarchar(MAX) 少,将在未来的版本中删除;这意味着您的代码将不再工作。
  • 可能相关:github.com/mkleehammer/pyodbc/issues/620 - 显然,默认情况下,ODBC 驱动程序将长字符串参数值发送为ntext 而不是nvarchar(max),可能是出于遗留原因。
  • @Larnu 数据类型已被 sqlalchemy 或 pyodbc 驱动程序更改。无论如何,通过在 orm 查询中将 sorted_json 转换为 NVARCHAR 解决了这个问题。谢谢。
  • @GordThompson 谢谢。这就是问题所在。
  • @NihalSangeeth - 很高兴听到您解决了问题。请考虑发布您的发现作为答案,以便其他人受益。

标签: python sql-server sqlalchemy azure-sql-database pyodbc


【解决方案1】:

通过在 orm 查询中将 sorted_json 字符串转换为 NVARCHAR 部分解决了该问题,例如:

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

【讨论】:

    猜你喜欢
    • 2014-02-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-09
    相关资源
    最近更新 更多