Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 调查结果;varchar(max)和ntext不兼容=到运算符;当使用SQLAlchemy/FreeTDS比较字符串长时。_Python_Sql Server 2008_Sqlalchemy_Freetds - Fatal编程技术网

Python 调查结果;varchar(max)和ntext不兼容=到运算符;当使用SQLAlchemy/FreeTDS比较字符串长时。

Python 调查结果;varchar(max)和ntext不兼容=到运算符;当使用SQLAlchemy/FreeTDS比较字符串长时。,python,sql-server-2008,sqlalchemy,freetds,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

在说明问题之前,请先说明围绕此问题使用的设置:

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

我不知道为什么会出现这个错误,需要帮助来解决它。我一直在努力寻找解决方案,但还没有找到答案,因此非常感谢您的帮助

即使主题类似,以下线程也不提供答案:

注意:我试图在python代码中不使用直接SQL语句,否则强制转换可能是一种解决方案


注意:我的数据库字段已声明为VARCHAR(MAX),而不是text。

如果您想避免在原始SQL中使用
CAST
语句,并坚持使用ORM,则必须更改SQL Server列的结构。这是SQL Server的一个限制,没有进一步的限制

你可以做两件事中的一件

VARCHAR(MAX)
列更改为
NTEXT

ALTER TABLE table_name ALTER COLUMN varchar_column NTEXT;
或者,将两列更改为
NVARCHAR(MAX)

在做任何一件事之前,我都读过这两个决定的副作用。然而,我建议在这种情况下,从ORM中删除原始SQL是您可以做出的最佳决策。根据我的经验,当源数据库由ORM构建时,ORM工作得最好;试图将一个ORM强加在一个设计时没有考虑ORM的数据库上,充其量只能带来妥协,最坏的情况下也只能带来意想不到的后果

祝你好运

ALTER TABLE table_name ALTER COLUMN ntext_column NVARCHAR(MAX);
ALTER TABLE table_name ALTER COLUMN varchar_column NVARCHAR(MAX);