使用 Python 3 动态插入到 sqlite

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 语句?

谢谢

Kor*_*eyD 5

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)