将元组的元素插入数据库
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 数据框,以便每个元组的第一个值代表一列?