Python pymssql插入错误

时间:2017-08-18 17:08:46

标签: pymssql

我的表有24列,我表中列的一半左右是float数据类型。指定24提交,我在这里截断了插入语句。

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')]

2 个答案:

答案 0 :(得分:0)

下面的功能帮助我找出原始数据的错误。它给我详细信息,例如我正在尝试插入的每个值的数据类型以及传递给insert语句的值的计数。现在我设法覆盖并将数据插入到数据库中,不包括问题记录。

现在我正在修复我的问题记录并将其输入数据库。

def is_float(s):  尝试:   如果s为None:    返回False   f =浮动   返回True  除了ValueError:   返回False

print(len(row))  for i,v in enumerate(row):   print(i,is_float(v),row [i])

答案 1 :(得分:0)

正如您所发现的,源数据中令人烦恼的行包含“N / A”字样。对于float列" Compression_ration"和' N / A'无法解析为数值。您可以替换N / A'使用None通过更改

中的查询参数来插入null
tuple(row)

tuple(None if x == 'N/A' else x for x in row)