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);