[英]Python Sqlite3 insert operation with a list of column names
通常,如果我想将值插入表中,我会做这样的事情(假设我知道我想插入的值属于哪些列):
conn = sqlite3.connect('mydatabase.db')
conn.execute("INSERT INTO MYTABLE (ID,COLUMN1,COLUMN2)\
VALUES(?,?,?)",[myid,value1,value2])
但是现在我有一个列列表(列表的长度可能会有所不同)和列表中每个列的值列表。
例如,如果我有一个包含 10 列的表(即 column1、column2...、column10 等)。 我有一个要更新的列列表。比方说[column3,column4]
。 我有这些列的值列表。 [value for column3,value for column4]
。
我如何将列表中的值插入到每个属于的各个列中?
据我所知, conn.execute
的参数列表仅适用于值,因此我们必须使用这样的字符串格式:
import sqlite3
conn = sqlite3.connect(':memory:')
conn.execute('CREATE TABLE t (a integer, b integer, c integer)')
col_names = ['a', 'b', 'c']
values = [0, 1, 2]
conn.execute('INSERT INTO t (%s, %s, %s) values(?,?,?)'%tuple(col_names), values)
请注意,这是一次非常糟糕的尝试,因为将始终检查传递给数据库的字符串是否受到注入攻击。 但是,您可以在插入之前将列名列表传递给某些注入函数。
编辑:
对于各种长度的变量,您可以尝试类似
exec_text = 'INSERT INTO t (' + ','.join(col_names) +') values(' + ','.join(['?'] * len(values)) + ')'
conn.exec(exec_text, values)
# as long as len(col_names) == len(values)
当然,字符串格式化将起作用,您只需要对此稍加精巧即可。
col_names = ','.join(col_list)
col_spaces = ','.join(['?'] * len(col_list))
sql = 'INSERT INTO t (%s) values(%s)' % (col_list, col_spaces)
conn.execute(sql, values)
我一直在寻找一种基于未知/可变长度列表创建列的解决方案,但发现了这个问题。 但是,我设法找到了一个更好的解决方案(无论如何对我来说),它也变得更现代了,所以我想将它包括进来,以防它对某人有所帮助:
import sqlite3
def create_sql_db(my_list):
file = 'my_sql.db'
table_name = 'table_1'
init_col = 'id'
col_type = 'TEXT'
conn = sqlite3.connect(file)
c = conn.cursor()
# CREATE TABLE (IF IT DOESN'T ALREADY EXIST)
c.execute('CREATE TABLE IF NOT EXISTS {tn} ({nf} {ft})'.format(
tn=table_name, nf=init_col, ft=col_type))
# CREATE A COLUMN FOR EACH ITEM IN THE LIST
for new_column in my_list:
c.execute('ALTER TABLE {tn} ADD COLUMN "{cn}" {ct}'.format(
tn=table_name, cn=new_column, ct=col_type))
conn.close()
my_list = ["Col1", "Col2", "Col3"]
create_sql_db(my_list)
我所有的数据都是文本类型的,所以我只有一个变量“ col_type”-但是,例如,您可以输入一个元组列表(或元组的元组,如果您要输入的内容):
my_other_list = [("ColA", "TEXT"), ("ColB", "INTEGER"), ("ColC", "BLOB")]
并将CREATE A COLUMN步骤更改为:
for tupl in my_other_list:
new_column = tupl[0] # "ColA", "ColB", "ColC"
col_type = tupl[1] # "TEXT", "INTEGER", "BLOB"
c.execute('ALTER TABLE {tn} ADD COLUMN "{cn}" {ct}'.format(
tn=table_name, cn=new_column, ct=col_type))
作为菜鸟,我无法评论@ron_g 提供的非常简洁、更新的解决方案。 在测试时,尽管我不得不经常删除示例数据库本身,所以对于使用它进行测试的任何其他新手,我建议添加:
c.execute('DROP TABLE IF EXISTS {tn}'.format(
tn=table_name))
在“创建表...”部分之前。
似乎有多个实例
.format(
tn=table_name ....)
在“CREATE TABLE ...”和“ALTER TABLE ...”中,因此试图弄清楚是否可以创建单个实例(类似于或包含在 def 部分中)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.