【问题标题】:Python : How to insert a dictionary to a sqlite database?Python:如何将字典插入 sqlite 数据库?
【发布时间】:2012-06-06 11:14:34
【问题描述】:

我有一个带有以下列的表的 sqlite 数据库:

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

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

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

字典键是列名。我怎样才能实现它?

【问题讨论】:

  • 你试过什么?你是如何连接到数据库的?你在使用任何一种 ORM 吗?
  • 你能提供一些你试过的代码吗??
  • 你不能轻易插入字典,但你可以插入一个列表。看看at the docs
  • 一个可能的解决方案是修改 docs 中的 Class IterChars() 。我无法适应它。看看sqlalchemy 可能也会有所帮助

标签: python sqlite dictionary


【解决方案1】:

查看文档here 可以添加一行:

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】:

这是一种保持参数安全的方法。 (可能需要在表名部门打磨)

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)

【讨论】:

    【解决方案3】:

    要直接使用字典,你可以这样做:

    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(与表的主键名称相同)。

    【讨论】:

      【解决方案4】:

      例如,如果c = conn.cursor(),并且您的字典名为dict,而您的表名为tablename,那么您可以编写

      c.execute('insert into tablename values (?,?,?)', [dict['id'], dict['name'], dict['dob']])
      

      这将根据需要将字典的元素插入到表中。

      【讨论】:

        【解决方案5】:

        根据 Gareth 的回复,如果您使用的是 MySQLdb,您可以使用 executemany 并传递一个值列表,您可以使用 dict.values() 直接从您的 dict 获取这些值

        【讨论】:

        • 使用此方法时请注意排序,因为光标会根据顺序插入,字典不保持顺序。
        • 小更新:字典现在保持 3.6 的顺序,并且这种行为将在 3.7 的语言规范中。
        猜你喜欢
        • 1970-01-01
        • 2013-11-14
        • 2014-02-23
        • 1970-01-01
        • 2011-02-07
        • 1970-01-01
        • 2011-07-22
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多