SQL Alchemy типы данных text и text несовместимы в одинаковом операторе - PullRequest
0 голосов
/ 15 мая 2018

В части моего 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 - это просто таблица со столбцом для серийного номера memosern1 и memosern2, введите с memotype и сами примечания как memotext, серийные номера и тип - varchar и memotext как текст.Я действительно не понимаю, что на самом деле означает text and text are incompatible, это не имеет никакого смысла, также я просто фильтрую серийный номер, ничего больше, так что с этим странным запросом?

И я могу прекрасно создатьдругая строка в таблице с точно такими же используемыми переменными (newtext), я просто не могу обновить существующую.

Есть идеи?Я могу предоставить больше информации

1 Ответ

0 голосов
/ 15 мая 2018

Тип TEXT на самом деле просто BLOB и может быть очень большим, в зависимости от вашего сервера баз данных 2 ** 64-1 байт или даже больше.Из-за его (возможного) размера оператор равенства не реализован для TEXT и BLOB, поэтому вы не можете сравнивать значения типа TEXT ни с чем (в вашем случае TEXT to TEXT).

То, что вам нужно сделать, - это либо использовать VARCHAR, либо - слегка хакерски - вычислить и сохранить хэш столбца TEXT и сравнить его вместо этого.Если вы вычислите MD5() значения TEXT, сохраните только верхний 64-битный код как INT и поместите функциональный индекс в этот столбец, вы можете получить тот же результат без особых затрат (кроме дополнительного хеша)+ операция индексации при вставке / обновлении и очень небольшая вероятность того, что вы сравните что-то с равенством, которое на самом деле не равно).

В долгосрочной перспективе вы должны использовать VARCHAR вместо TEXT, как TEXT будет удалено из будущих версий SQL Server.

...