我的表有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')]
答案 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
通过更改
tuple(row)
到
tuple(None if x == 'N/A' else x for x in row)