【问题标题】:Inserting tuple's elements to database将元组的元素插入数据库
【发布时间】:2011-12-24 11:39:07
【问题描述】:

我有一个元组,我想存储它的元素,我试图将它插入如下,它给出了以下错误,我做错了什么? records_to_be_inserted 是包含 8 个元素的元组。

with self.connection:
        cur = self.connection.cursor()
        cur.executemany("INSERT INTO rehberim(names, phone, mobile, email, \
                        photo, address, note, date) VALUES(?, ?, ?, ?, ?, ?, ?, ?)", self.records_to_be_inserTed)

Traceback(最近一次调用最后一次): 文件“/home/tayfun/workspace/personal_guide/modules/mainwindow.py”,第 57 行,在 save_records 中 照片,地址,注释,日期)值(?,?,?,?,?,?,?,?)“,self.records_to_be_inserTed) sqlite3.ProgrammingError:提供的绑定数量不正确。当前语句使用 8,提供了 0。

【问题讨论】:

    标签: python sqlite lastinsertid


    【解决方案1】:

    请注意,executemany 用于插入多行,例如,

    import sqlite3
    
    """ the table structure is:
    create table tab
        a char(1),
        b char(2),
        c char(3)
    )
    """
    
    conn = sqlite3.connect('C:\\test.db')
    stmt = "insert into tab (a, b, c) values (?, ?, ?)"
    
    cur = conn.cursor()
    ## many rows
    vals = [('1','2','3'), ('2','3','4'), ('3','4','5')]
    
    cur.executemany(stmt, vals)
    cur.close()
    

    这将在数据库中产生三行。如果是因为你在一个查询中有多个值,你需要格式化!

    编辑:添加了字典格式

    通过使用以下方法,您无需考虑 format 调用中值的顺序,因为字典中的键将值映射到 {key_word} 占位符。

    values = {'a' : 'value_a',
              'b' : 'value_b'}
    
    stmt = "insert into tab (col_a, col_b) values ({a}, {b})".format(**values)
    

    【讨论】:

    • 不要格式化 SQL 语句(除非你不能以任何其他方式这样做,例如如果你在表名中替换),因为这样很容易遇到 SQL 注入问题。
    • 我想做的不是一次插入多行,比如说,我在 db 上只有 5 个字符串对象和 6 个字段,1 个用于自动 id,5 个用于字符串。
    【解决方案2】:

    查询必须准备好插入所有数据。 您在查询中调用了一个函数,我想您希望它提供数据但不起作用。 您需要在变量中传递所有数据或在元组索引中定位它们(​​例如:tuple_name[1]、tuple_name[4] 等)

    例子:

    myTuple = ['a','b','c','d','e','f','g']
    cur.executemany("INSERT INTO rehberim(names, phone, mobile, email, \
                        photo, address, note, date) VALUES({0}, {1}, {2}, {3}, {4}, {5}, {6}" .format (myTuple[1], myTuple[2], myTuple[3], myTuple[4], myTuple[5], myTuple[6], myTuple[7])
    

    【讨论】:

    • 我将它设置为元组 cuz 当我按照你说的做时,它给出了以下错误: Traceback(最近一次调用最后一次):文件“/home/tayfun/workspace/personal_guide/modules/mainwindow. py",第 58 行,在 save_records self.mob_num、self.email、self.photo、self.address、self.note、self.celeb) 类型错误:函数只需要 2 个参数(给定 9 个)
    • @dex19dt -> 请记住,您使用的列表是从零开始的,因此您应该使用 myTuple[0] 等,而不是从 1 开始。同时,如果顺序正确,只需解压列表即可。这样可以节省一些空间:.format(*myTuple)
    • 我想他只是想给我指路,谢谢,但它也给我的错误,format() 要求正好 2 个参数,并且给出了 1 个。
    • 是的 - 使用格式时有很多可能性(我假设这是您现在使用的)例如,您可以使用字典以正确的顺序格式化
    • 不要格式化 SQL 语句(除非你不能以任何其他方式这样做,例如如果你在表名中替换),因为这样很容易遇到 SQL 注入问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-12-26
    • 1970-01-01
    • 1970-01-01
    • 2012-04-14
    • 1970-01-01
    • 2019-12-05
    • 2013-03-29
    相关资源
    最近更新 更多