SQL Alchemy数据类型文本和文本在相等的运算符中是不兼容的

时间:2018-05-15 12:29:49

标签: python django sqlalchemy python-2.x

在我的django API的一部分中,我有以下内容,以更新旧笔记:

old_note = request.databaseSession.query(Tmemo).\
    filter(Tmemo.memosern1 == serial).\
    one()

这个查询没有任何问题,因为我在许多其他地方使用它。奇怪的问题来自:

old_note.memotext = newtext

然后,当我提交时,会发生以下错误:

ProgrammingError: (pyodbc.ProgrammingError) ('42000', u'[42000] 
[Microsoft][ODBC Driver 17 for SQL Server][SQL Server]The data types 
text and text are incompatible in the equal to operator. (402) 
(SQLExecDirectW)') [SQL: u'UPDATE tmemo SET memotext=? WHERE 
tmemo.memosern1 = ? AND tmemo.memosern2 = ? AND tmemo.memotype = ? AND 
tmemo.memotext = ?'] [parameters: ('asassasasasaassaassaasas2121', 
u'P03000000060445', u'MEMO', u'5', u'asassasasasaassaassaasas')] 
(Background on this error at: http://sqlalche.me/e/f405)

Tmemo只是一个包含序列号memosern1memosern2列的表格,其中memotype类型,注释本身为memotext,序列号和类型为varchar和memotext作为文本。我真的不明白text and text are incompatible究竟是什么意思,没有意义,我只是过滤序列号,没有别的,那么这个奇怪的查询是什么呢?

我可以在表格中完美地创建另一行,使用完全相同的变量(newtext),我无法更新现有的行。

任何想法?我可以提供更多信息

1 个答案:

答案 0 :(得分:2)

TEXT - 类型实际上只是BLOB并且可能非常大,具体取决于您的数据库服务器2 ** 64-1字节甚至更多。由于它的(可能)大小,TEXTBLOB没有实现等于运算符,因此您无法将类型TEXT的值与任何内容进行比较(在您的情况下{{1} }})。

你需要做的是使用TEXT to TEXT或者 - 或者稍微有点hacky - 计算并存储VARCHAR - 列的哈希值,然后进行比较。如果你计算TEXT - 值的MD5(),只将高64位存储为TEXT并在该列上放置一个功能索引,你基本上可以得到相同的结果而不会过多成本(插入/更新时的额外散列+索引操作除外,并且将某些内容与不相等的相等性进行比较的可能性非常小)。

从长远来看,您应该使用INT代替VARCHAR,因为TEXT将是removed from future versions of SQL Server.