在 python 中编写通用 cursor.executemany()

Posted

技术标签:

【中文标题】在 python 中编写通用 cursor.executemany()【英文标题】:Writing Generic cursor.executemany() in python 【发布时间】:2021-02-04 04:15:11 【问题描述】:

我是 python 新手,尝试编写一个通用函数,其参数为字典列表、表名、数据库用户名、密码,并将不同的数据插入到不同的表中,如下所示

dict_list=['name': 'sandeep', 'age': '10', 'name': 'sa', 'age': '0'] another_dict_list=['area': 'AP', 'pin': '00', 'area': 'UP', 'pin': '01']

def func(listofdict, tablename, dbusername, dbpassword):
  #all connection and cursor code  here#
  query = """insert into tablename (dict keys) values(dict values)"""
  cursor.executemany(query, listofdict)

现在我调用上面的函数

func(dict_list, nametable, dbuser, dbpassword)
func(another_dict_list ,areatable, dbuser, dbpassword)

想知道我们是否可以编写一个通用代码来使用 execute many 插入数据

【问题讨论】:

执行这个游标会给你一个AttributeError,因为你传递了一个单一的参数并且期望很多,cursor.executemany(query, listofdict)。因此,我认为如果您尝试将 listofdic 放入集合列表中以将数据库中的每个值插入到每一行中,就像 cursor.executemany(query, (listofdict,)) 好的。我们可以使用 executemany 编写这样的通用代码吗? Ofc,给我一点时间给你申请一个executemany 例子 【参考方案1】:

要访问list of dictionaries 的数据,您需要使用循环来执行此操作,导致其双重列表。

我使用sqlite3 创建了一个数据库,所以您可以联系我正在做的事情;

首先,我创建了数据库:

__author__ = "D/R"

import sqlite3
conn = sqlite3.connect("demo.sqlite", detect_types=sqlite3.PARSE_DECLTYPES)

conn.execute("CREATE TABLE IF NOT EXISTS dicListTable ("
             "name TEXT NOT NULL,"
             "age INTEGER NOT NULL)")

词典列表:

list_dic = ['name': 'sandeep', 'age': 10, 'name': 'sa', 'age': 14]

功能:

def func(list_of_dict):

    cursor = conn.cursor()
    query = "insert into dicListTable (name, age) VALUES (?, ?)"
    for i in range(0, len(list_of_dict)):
        cursor.executemany(query, ((list_of_dict[i]["name"], list_of_dict[i]["age"]),))
    cursor.connection.commit()

调用函数

func(list_dic)

关闭数据库

conn.close()

输出

+---------+-----+
|   name  | age |
+---------+-----+
| sandeep |  10 |
+---------+-----+
|    sa   |  14 |
+---------+-----+

【讨论】:

【参考方案2】:

假设字典列表至少包含一个条目并且每个条目具有相同的键,您可以执行以下操作:

def func(table_name, args):
    names = list(args[0].keys())
    column_names = ",".join(names)
    bv_names = ",".join(":" + n for n in names)
    sql = f"insert into table_name (column_names) values (bv_names)"
    cursor.executemany(sql, args)

第一行假设 args 中至少有一个条目,并且它是一个字典,并且所有后续条目也是具有相同键的字典。如果这些假设中的任何一个不正确,则该函数将失败。

接下来的几行构建了您要使用绑定变量执行的 SQL。

【讨论】:

谢谢安东尼,我想要这种通用函数

以上是关于在 python 中编写通用 cursor.executemany()的主要内容,如果未能解决你的问题,请参考以下文章

在 python 中编写通用 cursor.executemany()

使用 Python 和 mySQL(以及作为操作系统的 windows), cursor.execute() 不返回任何结果,但它正在连接

python链接数据库pymysql

在python中为字符串和列表编写一个通用函数

用于包装尝试的通用装饰器除了在 python 中?

mysql-python 的 bigint 格式说明符