在陈述问题之前,让我先说明一下围绕此问题使用的设置:
Compile-time settings (established with the "configure" script)
Version: freetds v0.95.81
freetds.conf directory: /etc
MS db-lib source compatibility: yes
Sybase binary compatibility: yes
Thread safety: yes
iconv library: yes
TDS version: 4.2
iODBC: no
unixodbc: yes
SSPI "trusted" logins: no
Kerberos: yes
OpenSSL: no
GnuTLS: yes
- SQLAlchemy 版本 1.1.13
- 连接到 MS SQL Server 2008。
问题描述:
我在数据库中有一个如下所示的表:
DNA Sequence
id (int, primary key)
NTSequence (varchar(max))
在 SQLAlchemy 模型中,表的表示方式如下:
class DNAPtsSeq(Base):
id = Column("DNAPartsSequenceID", Integer, primary_key=True)
nt_seq = Column("NTSequence", VARCHAR('max'))
我像这样连接到数据库:
prod_eoi_engine = create_engine(
"mssql+pyodbc://someuser:somepw@somehost:1234/EOI?driver=FreeTDS")
这是我连接到数据库的方式:
def set_con(engine):
# Create a db session outside of the ORM that we can roll back
connection = engine.connect()
# bind db.session to that connection, and start a nested transaction
session = Session(bind=connection)
session.autoflush = True
return session
当我使用以下 SQLAlchemy 查询来查询数据库时:
dna_pts_seq = db_s.query(DNAPtsSeq).filter(DNAPtsSeq.nt_seq ==
nt_seq).first()
我在特定情况下遇到了问题。
如果 nt_seq 超过 2000 bp,我会收到以下错误:
ProgrammingError}(pyodbc.ProgrammingError) ('42000', '[42000] [FreeTDS][SQL
Server]The data types varchar(max) and ntext are incompatible in the equal
to operator. (402)
如果 nt_seq 达到 2000 bp,则一切正常。
我不知道为什么会收到此错误,需要帮助来解决该问题。我一直在尝试寻找解决方案,但尚未找到答案,因此我们将不胜感激。
即使主题相似,以下主题也未提供答案:
OLEDB comparison problem nvarchar against ntext (SQLServer 2005)
注意:我试图不在 python 代码中使用直接 SQL 语句,否则转换可能是一个解决方案。
The data types text and varchar are incompatible in the equal to operator
注意:我的数据库字段已声明为 VARCHAR(MAX) 而不是文本。
最佳答案
如果您想避免在原始 SQL 中使用 CAST
语句并坚持使用 ORM,则需要更改 SQL Server 列的结构。这是 SQL Server 的限制,没有进一步的限制。
您可以执行以下两件事之一。
将 VARCHAR(MAX)
列更改为 NTEXT
:
ALTER TABLE table_name ALTER COLUMN varchar_column NTEXT;
或者,将两列更改为 NVARCHAR(MAX)
:
ALTER TABLE table_name ALTER COLUMN ntext_column NVARCHAR(MAX);
ALTER TABLE table_name ALTER COLUMN varchar_column NVARCHAR(MAX);
在做任何事情之前,我都会阅读这两个决定的副作用。但是,我建议在这种情况下,从 ORM 中删除原始 SQL 是您可以做出的最佳决定。根据我的经验,当源数据库由 ORM 构建时,ORM 效果最佳;尝试在设计时未考虑 ORM 的数据库上强加 ORM 往好里说总会有妥协,往坏里说会产生意想不到的后果。
祝你好运!
关于python - 使用 SQLAlchemy/FreeTDS 当比较字符串很长时查找 "varchar(max) and ntext are incompatible = to operator"。,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49910052/