【问题标题】:Inserting to sqlite dynamically with Python 3使用 Python 3 动态插入到 sqlite
【发布时间】:2013-12-27 02:37:54
【问题描述】:

我想用 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])

我希望发生两件事:

a) 动态设置 tablename - 我还没有找到一个这样做的例子。

b) 正确使用 data_list 值 - 请注意列表的长度会有所不同(根据示例)。

但以上不起作用 - 如何动态创建 sqlite3.execute 语句?

谢谢

【问题讨论】:

    标签: python sqlite python-3.x


    【解决方案1】:

    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)
    

    执行此操作后,然后使用添加的 select 语句重新执行代码(只是为了测试它):

    dbc.execute("""
    select * from numbers_table
    """)
    print(dbc.fetchall());
    
    dbc.execute("""
    select * from text_table
    """)
    print(dbc.fetchall());
    

    我得到了结果:

    [(1, 2, 3, 4, 5)]
    [(u'pies', u'cakes')]
    

    【讨论】:

    • 体面的分析,你也测试了你的建议。好答案!
    • 谢谢。我曾尝试过这种放置表名的方法,但它不起作用。从那以后,我发现我的表名不好。无论如何,我只是把它放进去,它工作得很好。非常感谢。欢迎来到 SO! :-)
    猜你喜欢
    • 1970-01-01
    • 2018-12-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-03
    相关资源
    最近更新 更多