将元组的元素插入数据库

Posted

技术标签:

【中文标题】将元组的元素插入数据库【英文标题】: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。

【问题讨论】:

【参考方案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 注入问题。

以上是关于将元组的元素插入数据库的主要内容,如果未能解决你的问题,请参考以下文章

如何将元组列表转换为 pandas 数据框,以便每个元组的第一个值代表一列?

如何将元组的所有第一个元素与同一元组中相应的第二个元素进行比较

MySql数据库之数据更新(插入数据修改数据删除数据)

将元组的无序列表转换为 pandas DataFrame

将元组的字符串表示形式转换为真正的元组

列表与元组的基本操作