GIS*_*han 2 python sqlite python-3.x
我想使用 sqlite 写入多个表,但我不想提前手动指定查询(有数十种可能的排列)。
例如:
def insert_sqlite(tablename, data_list)
global dbc
dbc.execute("insert into " + tablename + " values (?)", data_list)
tables_and_data = {
'numbers_table': [1,2,3,4,5],
'text_table': ["pies","cakes"]
}
for key in tables_and_data:
insert_sqlite(key, tables_and_data[key])
Run Code Online (Sandbox Code Playgroud)
我希望发生两件事:
a)tablename动态设置 - 我还没有找到一个这样做的例子。
b)data_list正确使用的值 - 请注意列表的长度有所不同(根据示例)。
但上面的方法不起作用 - 如何动态创建 sqlite3.execute 语句?
谢谢
a)上面的代码似乎正确设置了表名称,所以没有问题
b) 您希望为其插入值的每列都需要一个 ?(占位符)。
当我按原样重新创建代码并运行它时,我收到错误消息:“sqlite3.OperationalError:表numbers_table 有 5 列,但提供了 1 个值”。
解决方案是编辑函数以动态创建正确数量的占位符:
def insert_sqlite(tablename, data_list):
global dbc
dbc.execute("insert into " + tablename + " values (" + ('?,' * len(data_list))[:-1] + ")", data_list)
Run Code Online (Sandbox Code Playgroud)
执行此操作后,然后使用添加的 select 语句重新执行代码(只是为了测试它):
dbc.execute("""
select * from numbers_table
""")
print(dbc.fetchall());
dbc.execute("""
select * from text_table
""")
print(dbc.fetchall());
Run Code Online (Sandbox Code Playgroud)
我得到结果:
[(1, 2, 3, 4, 5)]
[(u'pies', u'cakes')]
Run Code Online (Sandbox Code Playgroud)