【发布时间】: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