(fast_executemany = True) 错误“[ODBC Driver 17 for SQL Server]强制转换规范 (0) (SQLExecute)'的字符值无效”)
Posted
技术标签:
【中文标题】(fast_executemany = True) 错误“[ODBC Driver 17 for SQL Server]强制转换规范 (0) (SQLExecute)\'的字符值无效”)【英文标题】:(fast_executemany = True) Error "[ODBC Driver 17 for SQL Server]Invalid character value for cast specification (0) (SQLExecute)')"(fast_executemany = True) 错误“[ODBC Driver 17 for SQL Server]强制转换规范 (0) (SQLExecute)'的字符值无效”) 【发布时间】:2020-07-27 00:13:47 【问题描述】:我正在使用 pyodbc 中的 (executemany) 函数将数据填充到 mssql 数据库中。这是我的代码:
def populate_database(conn):
tuples = [
('2020-04-13 00:50:42', 'AirShoppingRQ', 'ALEY', '2020-05-23', '', '', 'BRU-BLQ', ''),
('2020-04-13 00:50:43', 'AirShoppingRQ', 'ALEY', '2021-01-23', '', '', 'LIS-STO', '')
]
query_string = 'INSERT INTO mytable VALUES (?,?,?,?,?,?,?,?)'
cursor = conn.cursor()
#cursor.fast_executemany = True
cursor.executemany(query_string, tuples)
cursor.commit()
它工作正常,但如果我取消注释行 cursor.fast_executemany = True
,然后我得到以下错误:
('22018', '[22018] [Microsoft][ODBC Driver 17 for SQL Server]Invalid character value for cast specification (0) (SQLExecute)')
以下是我的表:
CREATE TABLE [dbo].[mytable](
[field1] [datetime] NULL,
[field2] [varchar](50) NULL,
[field3] [varchar](20) NULL,
[field4] [datetime] NULL,
[field5] [datetime] NULL,
[field6] [varchar](20) NULL,
[field7] [varchar](40) NULL,
[field8] [varchar](40) NULL
)
格式有问题吗?使用cursor.fast_executemany = True
时我错过了什么?
【问题讨论】:
【参考方案1】:使用fast_executemany = False
(默认值),pyodbc 每行发送一个 INSERT 并将参数值直接传递给 SQL Server。当 SQL Server 遇到一个空字符串作为 datetime
列的参数值时,该值被解释为 1900-01-01 00:00:00
。
使用fast_executemany = True
,pyodbc 将所有参数值打包到称为 参数数组 的二进制结构中,并将其与 SQL 命令文本一起传递,实质上是在单个中执行所有行的 INSERT步。但是,对于 datetime
列的空字符串,SQL Server ODBC 驱动程序不会做出与 T-SQL 相同的假设,因此您会收到错误。
TL;DR:如果您使用fast_executemany = False
,则可以将空字符串作为datetime
列的参数值传递,但如果您使用fast_executemany = True
,则不能。
【讨论】:
什么是使用 fast_executemany = True 的解决方案并且仍然能够将空插入日期列?? 将空字符串转换为None
值,它们将作为NULL插入到数据库中。
您能告诉我如何在数据框中将空字符串转换为 None 吗?
@harsha87 - 请ask a new question,展示您尝试过的方法以及为什么它不起作用。以上是关于(fast_executemany = True) 错误“[ODBC Driver 17 for SQL Server]强制转换规范 (0) (SQLExecute)'的字符值无效”)的主要内容,如果未能解决你的问题,请参考以下文章
为啥我会在一个很小的 df 上使用 fast_executemany 出现内存错误?
使用 fast_executemany 写入 MS-Access DB 不起作用
使用 pyODBC 的 fast_executemany 加速 pandas.DataFrame.to_sql
Linux上的pyodbc fast_executemany在插入时出现乱码