Python:如何将字典插入到SQLite数据库中?

24

我有一个sqlite数据库,其中一个表具有以下列:

id(int) , name(text) , dob(text)

我想将以下字典插入其中:

{"id":"100","name":"xyz","dob":"12/12/12"}

字典键是列名。我该如何实现?


5
你尝试过什么?你是如何连接数据库的?你使用了任何ORM吗? - pcalcao
你能提供一下你尝试过的代码吗? - shobhit
你不可以轻易地插入一个字典,但是你可以插入一个列表。请查看文档:https://docs.python.org/2/library/sqlite3.html#sqlite3.Cursor.executemany - DJJ
一个可能的解决方案是修改文档中的IterChars()类。但我无法适应它。查看sqlalchemy也可能有所帮助。 - DJJ
这个回答解决了你的问题吗?将字典中的值插入到SQLite数据库中 - wesinat0r
5个回答

18

要直接使用字典,您可以执行以下操作:

user1 = {"id":100, "name": "Rumpelstiltskin", "dob": "12/12/12"}
c.execute("INSERT INTO users VALUES (:id, :name, :dob)", user1) 

与实例/模型一起使用:

class User:                                                                      

    def __init__(self, name, dob):                                            
        self.name = name                                                             
        self.dob = dao  

u1 = User("Rumpelstiltskin", "12/12/12")
c.execute("INSERT INTO users VALUES (:name, :dob)", u1.__dict__)

id 是 Python 中的一个关键字,所以如果您想将其用作实例变量的标识符,我建议使用 _id(并且与您的表格主键名称相同)。


15

查看文档 这里,您可以添加单行:

c.execute("INSERT INTO stocks VALUES (?,?,?)", [dict["id"], dict["name"], dict["dob"]])

或者您可以使用列表,一次添加多行:

# Larger example that inserts many records at a time
purchases = [('2006-03-28', 'BUY', 'IBM', 1000, 45.00),
             ('2006-04-05', 'BUY', 'MSFT', 1000, 72.00),
             ('2006-04-06', 'SELL', 'IBM', 500, 53.00),
            ]
c.executemany('INSERT INTO stocks VALUES (?,?,?,?,?)', purchases)

2
也许更新一下,展示如何插入提问者字典列表?这样我认为你的回答比我的更好。 - Eliot Ball

9
这里有一种保留参数安全性的方法。(在表名方面可能需要修饰)
def post_row(conn, tablename, rec):
    keys = ','.join(rec.keys())
    question_marks = ','.join(list('?'*len(rec)))
    values = tuple(rec.values())
    conn.execute('INSERT INTO '+tablename+' ('+keys+') VALUES ('+question_marks+')', values)

row = {"id":"100","name":"xyz","dob":"12/12/12"}
post_row(my_db, 'my_table', row)

6
如果,例如c = conn.cursor(),并且你的字典名为dict,表名为tablename,那么你可以这样写:
c.execute('insert into tablename values (?,?,?)', [dict['id'], dict['name'], dict['dob']])

这将按照您的要求将字典的元素插入表中。


1
根据 Gareth 的回答,如果你使用的是 MySQLdb,你可以使用 executemany,并传递一个值列表,该列表可以直接从你的字典中使用 dict.values() 获取。

1
使用该方法时请注意进行排序,因为光标将基于顺序进行插入,而字典不维护顺序。 - Harrison
2
小更新:从3.6开始,字典现在保持顺序,并且这种行为将在3.7的语言规范中体现。 - Yekta Leblebici

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接