我正在使用 pymssql 连接到 Azure 上的 MS SQL 数据库并从 CSV 文件插入记录。我已验证连接是否成功,并且用于executemany 参数的列表包含格式正确且值数量正确的所有数据。但是,当我运行脚本时,会插入 0 行 - 但不会引发错误。
我环顾四周,似乎大多数其他经历过类似事情的人都缺少 commit(),但这不是这里的问题。
这是代码。非常感谢任何帮助。
with open('file.csv') as csvfile:
data = csv.reader(csvfile)
next(data)
dicts = ({'col1': line[0], 'col1': line[1], 'col3': line[2], 'col4': int(line[3]), 'col5': int(line[4]), 'col6': float(line[5])} for line in data)
to_db = ((i['col1'], i['col2'], i['col3'], i['col4'], i['col5'], i['col6']) for i in dicts)
cursor.executemany(
'INSERT INTO myTable VALUES (%s, %s, %s, %d, %d, %f)',
to_db)
print str(cursor.rowcount) + " rows inserted"
conn.commit()
编辑:如果我使用cursor.execute()执行查询并在查询中显式包含值,那么我可以成功地将行插入数据库(例如见下文)。
cursor.execute("INSERT INTO myTable VALUES ('4/18/2016','test','test',0,0,0.0)")
但是,如果我使用cursor.executemany(操作,参数)语法并将值列表作为参数传递,则会导致不正确的语法错误。
cursor.executemany("INSERT INTO myTable VALUES(%s,%s,%s,%d,%d,%f)",list_of_values)
我刚刚在 module reference 中阅读仅支持 %s 和 %d。所以我想这可能是问题所在。但是我如何传递 float 呢?
最佳答案
使用 float 占位符 (%f) 实际上是问题所在。仅支持 %s 和 %d,但它们纯粹是占位符,对它们在 python 中通常的格式化方式没有任何影响,因此实际上只需要 %s。工作代码如下:
cursor.executemany("INSERT INTO myTable VALUES(%s,%s,%s,%s,%s,%s)",list_of_values)
关于python - 使用 pymssql 成功连接到 Azure 上的 MS SQL DB,执行 INSERT 语句,没有错误消息,但插入了 0 行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38383457/