"Invalid character value for cast specification" 在 Python 中使用 pyodbc 时
"Invalid character value for cast specification" when using pyodbc in Python
我制作了一个 python 连接到 Mssql 数据库并在其中插入内容的脚本。
问题出在这一行:
cursor.execute("insert into TREND_DATA (TREND_ID, TREND_DATE, TREND_VALUE) values ((select TREND_ID from TRENDS where TREND_NAME = ?), ?, ?)", name, date, trend_value)
在这一行之后我得到这个错误:
cursor.execute("insert into TREND_DATA (TREND_ID, TREND_DATE, TREND_VALUE) values ((select TREND_ID from TRENDS where TREND_NAME = ?), ?, ?)", name, date, trend_value)
pyodbc.DataError: ('22018', '[22018] [Microsoft][ODBC SQL Server Driver]Invalid character value for cast specification (0) (SQLExecDirectW)')
我试着用 'abc' 代替 "name" 但我得到了同样的错误
cursor.execute("insert into TREND_DATA (TREND_ID, TREND_DATE, TREND_VALUE) values ((select TREND_ID from TRENDS where TREND_NAME = ?), ?, ?)", 'abc', date, trend_value)
但是这条线有效,我在数据库中得到新行:
cursor.execute("insert into TREND_DATA (TREND_ID, TREND_DATE, TREND_VALUE) values ((select TREND_ID from TRENDS where TREND_NAME = 'abc'), ?, ?)", date, trend_value)
我做错了什么?
你可以使用格式来解决这个问题:
cursor.execute("insert into TREND_DATA (TREND_ID, TREND_DATE, TREND_VALUE) values ((select TREND_ID from TRENDS where TREND_NAME = {0}), ?, ?)".format(name), date, trend_value)
好像是? ()里面有问题
然而,这有一些安全隐患,不应用作永久解决方案。
pyodbc 4.0.22 中引入的更改在使用查询参数时导致了几个不同的错误。 pyodbc 4.0.23 的发布解决了这些问题。
我遇到了类似的问题。
使用 bulk_save_objects 并且工作得很好,但是使用 pyodbc 4.0.22 它开始抛出 bigints 的类型转换错误(在 python ).
'[22018] [Microsoft][ODBC Driver 13 for SQL Server]Invalid character value for cast specification (0) (SQLExecDirectW)') [SQL: u'INSERT INTO [gg_expo] ([ID], [Status], [Timestamp]) VALUES (?, ?, ?)'] [parameters: ((3903146347805142551L, 1, u'2018-08-01T09:06:34.244'), (3959371193446428183L, 0, u'2018-08-01T09:06:55.128'),
我不得不使用 add_all(the_list_of_rows)。希望这对某人有帮助!
我遇到了这个错误,并且能够通过将源中的类型与目标进行匹配来解决这个问题。
在我的例子中,我在插入之前将所有源代码批量转换为字符串,在目标位置 table 实际上有 2 个浮点列。
匹配类型后,插入工作正常。
我制作了一个 python 连接到 Mssql 数据库并在其中插入内容的脚本。
问题出在这一行:
cursor.execute("insert into TREND_DATA (TREND_ID, TREND_DATE, TREND_VALUE) values ((select TREND_ID from TRENDS where TREND_NAME = ?), ?, ?)", name, date, trend_value)
在这一行之后我得到这个错误:
cursor.execute("insert into TREND_DATA (TREND_ID, TREND_DATE, TREND_VALUE) values ((select TREND_ID from TRENDS where TREND_NAME = ?), ?, ?)", name, date, trend_value)
pyodbc.DataError: ('22018', '[22018] [Microsoft][ODBC SQL Server Driver]Invalid character value for cast specification (0) (SQLExecDirectW)')
我试着用 'abc' 代替 "name" 但我得到了同样的错误
cursor.execute("insert into TREND_DATA (TREND_ID, TREND_DATE, TREND_VALUE) values ((select TREND_ID from TRENDS where TREND_NAME = ?), ?, ?)", 'abc', date, trend_value)
但是这条线有效,我在数据库中得到新行:
cursor.execute("insert into TREND_DATA (TREND_ID, TREND_DATE, TREND_VALUE) values ((select TREND_ID from TRENDS where TREND_NAME = 'abc'), ?, ?)", date, trend_value)
我做错了什么?
你可以使用格式来解决这个问题:
cursor.execute("insert into TREND_DATA (TREND_ID, TREND_DATE, TREND_VALUE) values ((select TREND_ID from TRENDS where TREND_NAME = {0}), ?, ?)".format(name), date, trend_value)
好像是? ()里面有问题
然而,这有一些安全隐患,不应用作永久解决方案。
pyodbc 4.0.22 中引入的更改在使用查询参数时导致了几个不同的错误。 pyodbc 4.0.23 的发布解决了这些问题。
我遇到了类似的问题。
使用 bulk_save_objects 并且工作得很好,但是使用 pyodbc 4.0.22 它开始抛出 bigints 的类型转换错误(在 python ).
'[22018] [Microsoft][ODBC Driver 13 for SQL Server]Invalid character value for cast specification (0) (SQLExecDirectW)') [SQL: u'INSERT INTO [gg_expo] ([ID], [Status], [Timestamp]) VALUES (?, ?, ?)'] [parameters: ((3903146347805142551L, 1, u'2018-08-01T09:06:34.244'), (3959371193446428183L, 0, u'2018-08-01T09:06:55.128'),
我不得不使用 add_all(the_list_of_rows)。希望这对某人有帮助!
我遇到了这个错误,并且能够通过将源中的类型与目标进行匹配来解决这个问题。
在我的例子中,我在插入之前将所有源代码批量转换为字符串,在目标位置 table 实际上有 2 个浮点列。
匹配类型后,插入工作正常。