【发布时间】:2017-04-18 12:45:50
【问题描述】:
我是 Python 新手,所以我一直在根据我发现的内容编写脚本,并且进展顺利(也就是说,我的脚本可以正常工作,即使它们不是最优雅或最正确的)。我的最终目标是获取一个 csv,读取它,找到一个阶段,然后如果找到该短语,则将该行写入 SQL 数据库。我有这个工作,但我的问题是:
我应该在with 的每个循环内写一个.execute() 然后.commit()(这就是我现在正在做的)吗?或者我应该构建一个语句并在最后执行/提交(不确定如何执行此操作)?我通读了this post,看到了如何格式化插入,但不确定如何获取我的代码(如下)并调整以构建具有多个值的单个插入。关于第一种方法的任何帮助或建议都很好,或者第二种方法的正确方法会很棒!提前致谢!
背景:我正在使用 pypyodbc 和一个虚拟机。 python 脚本与 SQL Express 数据库位于同一 VM 上。
这是我的代码:
with open(CSVFILE, 'rt', encoding='utf8') as f:
if debug:
print('Inside the with')
reader = csv.reader(f, delimiter=',')
columns = next(reader)
query = 'insert into TABLENAME ({0}) values ({1})'
query = query.format(','.join(columns), ','.join('?' * len(columns)))
for row in reader:
for field in row:
if data.strSearch in field:
if debug:
print('Found: {}'.format(row[0]))
cursor.execute(query, row)
cursor.commit()
【问题讨论】:
-
您可以改为将每个循环上的每个感兴趣的
row附加到另一个列表,以提供嵌套列表。完成所有循环后,您可以调用executemany()并传递 list_of_rows 而不是execute()以一次性插入记录,然后commit()进行更改。但是commit()现在对于内部循环的每次迭代并不是绝对必要的,并且会增加运行时间。
标签: python sql insert pypyodbc