其他的SQL不清楚, pymysql是没有类似函数的。
说到框架,python常用的几个ORM, 我印象中也没有提供类似写法的。
既然没人写,而你又在php里觉得这么用趁手,不如自己按php的思路实现一个。
我自己写了个database类和一些工具函数, 你说的逻辑在我这里的代码大概这样:
data = database('test_db').query_dict("SELECT * FROM `table`")
generic_insert(data, 'insert_table')
insert数据库是在函数中写死的。如果你有多个数据库维护,可以考虑再抽象一下,在database类中实现。逻辑大概是:
# data is a dict
db = database('test_db').get_db()
db.insert(data, 'insert_table')
db.close()
分享自己用的insert函数。
from database import database
# 依赖pymysql
def generic_insert(data, target_table):
# 数据库查出的字段不存在不规则字典的情况
# 但如果是mongo过来的不规则字典,则最好在插入前做数据清理
# 每20000条数据插入一次, 20000条数据预期为2-3M大小
# $todo: 根据mysql的driver, 按insert stmt的大小来决定插入, 防止insert过大
i = 0
count = 0
con = database('test_database').get_db()
cur = con.cursor()
key_name = data[0].keys()
while i < len(data):
subdata = [tuple(x.values()) for x in data[i:(i + 20000)]]
insert_stmt = "INSERT INTO `{target_table}` (`{colname}`) VALUES ({values})".format(
target_table=target_table,
colname="`,`".join(key_name),
values=','.join(['%s' for x in range(len(key_name))])
)
try:
rows= cur.executemany(insert_stmt, subdata)
count += rows
con.commit()
except Exception as e:
print('INSERT ROWS: {}'.format(count))
cur.close()
con.close()
raise e
i += 20000
cur.close()
con.close()
return count