python - 使用 SQLAlchemy/FreeTDS 当比较字符串很长时查找 "varchar(max) and ntext are incompatible = to operator"。

标签 python sql-server-2008 sqlalchemy freetds

在陈述问题之前,让我先说明一下围绕此问题使用的设置:

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,则一切正常。

我不知道为什么会收到此错误,需要帮助来解决该问题。我一直在尝试寻找解决方案,但尚未找到答案,因此我们将不胜感激。

即使主题相似,以下主题也未提供答案:

Django SQLServer [FreeTDS][SQL Server]The data types nvarchar(max) and ntext are incompatible in the equal to operator

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/

相关文章:

python - 用于在 librecad 中无限调整大小的绘画的小部件

sql - 如何避免 SQL 中的重复子查询 JOIN?

solr - 将 solr/pysolr 与 flask sqlalchemy 一起使用

python - TableauException(40200):服务器未在Docker容器中回叫我们Python 3.6

python - 使用 python networkx 时是否可以将多个标签添加到单个节点(即一个主标签,然后是一个子标签)?

sql-server - 在 SQL Server Profiler 中查看运行过程

c# - 如何将来自数据库的数据更改为 DataGridView

python - 属性错误 : can't set attribute with flask-SQLAlchemy

python - SQLAlchemy - bool 混合属性

python时间减法