求从数据库里面按字典格式读取所有数据处理完后,再插入结构完全一致的数据库,最简单的办法?
1、字典结构完全和数据库字段一致
2、表有10多张、每张表有20-30个字段
3、如果组合成insert into table (字段) values(值) 会超级繁琐
4、在thinkphp 中有个方法 是 $sql->data($arr)->add(); 这样就能将数组插入数据库,python里面有类似简单的办法吗?
求从数据库里面按字典格式读取所有数据处理完后,再插入结构完全一致的数据库,最简单的办法?
1、字典结构完全和数据库字段一致
2、表有10多张、每张表有20-30个字段
3、如果组合成insert into table (字段) values(值) 会超级繁琐
4、在thinkphp 中有个方法 是 $sql->data($arr)->add(); 这样就能将数组插入数据库,python里面有类似简单的办法吗?
首先,一个是php框架的解决方案,一个是Python语言,这两个没有什么关联,你可以说flask或者Django有没有和tp类似的方法。
其次,我觉得$sql->data($arr)->add()的底层实现也是生成一条sql语句,毕竟建立sql链接的时间消耗太过于巨大,
三、可以用
select * into 目标表名 from 源表名
这个sql语句完全复制一个表
其他的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
3 回答3.1k 阅读✓ 已解决
2 回答3.1k 阅读✓ 已解决
3 回答1.7k 阅读✓ 已解决
2 回答1.9k 阅读✓ 已解决
2 回答1.3k 阅读✓ 已解决
2 回答1.2k 阅读✓ 已解决
2 回答1.4k 阅读✓ 已解决
如果只从快速生成插入语句来说,可以考虑写一个通用方法,根据字典自动生产sql语句:
打印结果: