Python pymssql 插入错误
Posted
技术标签:
【中文标题】Python pymssql 插入错误【英文标题】:Python pymssql insert error 【发布时间】:2017-08-18 17:08:46 【问题描述】:我的表有 24 列,大约一半的列是浮点数据类型。指定24个字段,我这里把insert语句截断了。
csv_data = csv.reader(file('filename.csv'))
for row in csv_data:
cursor.execute('insert into ddreplication (CTX, Mode,...,Max_repl_streams) values (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s)', tuple(row))
错误:
File "pymssql.pyx", line 467, in pymssql.Cursor.execute
(pymssql.c:7561)
pymssql.OperationalError: (8114, 'Error converting data type varchar to float.DB-Lib error message 20018, severity 16:\nGeneral SQL
Server error: Check messages from the SQL Server\n')
我在另一个运行良好且没有任何问题的脚本上拥有几乎相同的代码。
输出 “SELECT COLUMN_NAME, DATA_TYPE FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME='ddreplication' ORDER BY ORDINAL_POSITION”
[(u'CTX', u'int'), (u'Mode', u'nvarchar'), (u'Destination', u'nvarchar'), (u'Connection_Host', u'nvarchar' ), (u'Enabled', u'nvarchar'), (u'Low_bandwidth_optimization', u'nvarchar'), (u'Replication_encryption', u'nvarchar'), (u'Replication_propagate_retention_lock', u'nvarchar'), (u'Local_fs_status', u'nvarchar'), (u'Connection', u'nvarchar'), (u'State', u'nvarchar'), (u'Error', u'nvarchar'), (u 'Network_bytes_to_destination', u'float'), (u'PreComp_bytes_written_to_source', u'float'), (u'PreComp_bytes_sent_to_destination', u'float'), (u'Bytes_after_synthetic_optimization', u'float'), (u'Bytes_after_filtering_by_destination ', u'float'), (u'Bytes_after_low_bandwidth_optimization', u'float'), (u'Bytes_after_local_comp', u'float'), (u'PreComp_bytes_remaining', u'float'), (u'Compression_ration', u'float'), (u'Synced_as_of_time', u'nvarchar'), (u'Current_throttle', u'nvarchar'), (u'Max_repl_streams', u'nvarchar')]
【问题讨论】:
你能提供样本数据吗?此外,您检查了 CSV 中的列顺序是否与 INSERT 语句的列列表完全匹配? 我从我的数据文件中附加了 2 行。我已经仔细检查了 CSV 匹配插入语句中的列顺序。由于此处的空间,我已经截断了 2 行数据 19,destination,mtree://dd9500ausprd01.storage.anz/data/col1/oracle-longterm-fromtm,dd9500ausdr01R.storage.anz,yes,disabled,disabled,enabled,enabled,自 8 月 19 日星期六 02:33:45 以来空闲,正常,无错误,324423376,0,0,0,0,0,0,0,N/A,8 月 19 日星期六 02:33,无限制(仅恢复),32 (默认) 20,source,mtree://d234sdfcom1.storage.com/data/col1/FROMNSDEVMW,....4624454382864,...,3812323071052,0,22.1,Sat Aug 19 02:46,unlimited,32 (默认) 请edit你的问题显示cursor.execute("SELECT COLUMN_NAME, DATA_TYPE FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME='ddreplication' ORDER BY ORDINAL_POSITION"); print(cursor.fetchall())
的结果
另外,请添加 then 函数 def is_float(s): try: if s is None: return False f = float(s) return True except ValueError: return False 在您的脚本中并发布输出这一行,请在cursor.execute
行之前插入: [print(i, is_float(v)) for i,v in enumerate(row)]
@Arminius - 您的建议帮助我找到了数据中的罪魁祸首。有一个特定的列应该写一些数字或 0,但它被写为“N/A”,这导致了我在问题中提到的错误。它还帮助我发现了在提取原始数据和创建 csv 文件时发生的另一个错误。我的 CSV 文件的最后一行有一些问题。现在我设法跳过这些错误并将我的数据放入 MSSQL DB。现在我将尝试修复我的代码,以避免首先出现这些错误。谢谢阿米纽斯
【参考方案1】:
以下函数帮助我找出原始数据中的错误。它为我提供了详细信息,例如我尝试插入的每个值的数据类型以及传递到插入语句中的值的计数。现在我设法覆盖并获取插入数据库的数据,不包括问题记录。
现在我正在修复我的问题记录并将其导入数据库。
def is_float(s): 尝试: 如果 s 为无: 返回假 f = 浮点数 返回真 除了ValueError: 返回错误
打印(长度(行)) 对于枚举(行)中的 i,v: print(i, is_float(v),row[i])
【讨论】:
【参考方案2】:正如您所发现的,源数据中的麻烦行包含 float
列“Compression_ration”的“N/A”,并且“N/A”无法解析为数值。您可以将“N/A”替换为 None
以通过更改查询参数来插入空值
tuple(row)
到
tuple(None if x == 'N/A' else x for x in row)
【讨论】:
以上是关于Python pymssql 插入错误的主要内容,如果未能解决你的问题,请参考以下文章
python3.7 使用pymssql往sqlserver插入数据
如何使用pymssql python插入但忽略相同的日期标签
python中pymssql如何向sql server插入数据 插入的值可以用变量替换