【问题标题】:Finding "varchar(max) and ntext are incompatible = to operator" when comparison string is long using SQLAlchemy/FreeTDS.当使用 SQLAlchemy/FreeTDS 比较字符串很长时,查找“varchar(max) 和 ntext 不兼容 = to operator”。
【发布时间】:2018-04-18 22:39:04
【问题描述】:

在我陈述问题之前,让我陈述一下围绕这个问题使用的设置:

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) 而不是文本。

【问题讨论】:

    标签: python sql-server-2008 sqlalchemy freetds


    【解决方案1】:

    如果您想避免在原始 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 总是有最好的妥协,最坏的情况是意想不到的后果。

    祝你好运!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-23
      • 2013-07-09
      • 1970-01-01
      • 1970-01-01
      • 2012-11-27
      • 1970-01-01
      相关资源
      最近更新 更多