Python中的动态INSERT语句

Dat*_*ays 7 sql sqlite python-2.7

我正在努力更新我一直在使用的一些Python代码,并且正在寻找一些关于处理我正在使用的想法的最佳方法的建议.我想改变的代码部分是:

my_reader = csv.reader(input, delimiter = ',',quotechar='|')
mouse.executemany("INSERT INTO Example_Input (ID,Name,Job,Salary) VALUES (?,?,?,?)", my_reader)
Run Code Online (Sandbox Code Playgroud)

代码有效.我的问题是,我可以将"(?,?,?,?)"更改为更像"range()"的动态内容以允许用户输入.我知道我还必须有一个动态创建表语句,所以另一种解决方案可能是计算输入数量.

更清楚一点:例如,如果我有raw_input("表包含多少个变量?:")并且输入为2,程序将知道如何运行(?,?).

思考?

(我也使用SQLite3和python 2.7)

Rob*_*tie 5

假设您的csv具有标头字段,则可以使用DictReader并生成其fieldnames属性的字段名称和参数。

DictReader的构造函数允许您指定字段名称(如果它们不在文件中),因此如果需要,您可以要求用户提供该信息。

假设标头在文件中,则此示例代码应工作:

import csv
import sqlite3

#Give the table a name and use it for the file as well
table_name = 'Example'
a = open(table_name + '.csv', 'r')

#Use a dict reader
my_reader = csv.DictReader(a)
print my_reader.fieldnames # Use this to create table and get number of field values,etc.

# create statement
create_sql = 'CREATE TABLE ' + table_name + '(' + ','.join(my_reader.fieldnames) + ')'
print create_sql

#open the db
conn = sqlite3.connect('example.db')
c = conn.cursor()
# Create table using field names
c.execute(create_sql)
insert_sql = 'insert into ' + table_name + ' (' + ','.join(my_reader.fieldnames) + ') VALUES (' + ','.join(['?'] * len(my_reader.fieldnames))+ ')'
print insert_sql

values = []
for row in my_reader:
    row_values = []
    for field in my_reader.fieldnames:
        row_values.append(row[field])
    values.append(row_values)

c.executemany(insert_sql, values)
Run Code Online (Sandbox Code Playgroud)