python从数据库读取出来的字典怎么更加方便的插入数据库

求从数据库里面按字典格式读取所有数据处理完后,再插入结构完全一致的数据库,最简单的办法?

1、字典结构完全和数据库字段一致
2、表有10多张、每张表有20-30个字段
3、如果组合成insert into table (字段) values(值) 会超级繁琐
4、在thinkphp 中有个方法 是 $sql->data($arr)->add();  这样就能将数组插入数据库,python里面有类似简单的办法吗?
阅读 3.3k
3 个回答

如果只从快速生成插入语句来说,可以考虑写一个通用方法,根据字典自动生产sql语句:



def dict_2_sql(dicts,db):
    names=','.join(dicts.keys())
    values=','.join(dicts.values())
    sql='insert into '+db+"("+names+") values("+values+")"
    return sql
if __name__ == '__main__':
    test = {
        'a': '1',
        'b': '2',
        'c': '3',
        'd': '4',
    }
    sql=dict_2_sql(test,"dbname")
    print(sql)

打印结果:

insert into dbname(a,b,c,d) values(1,2,3,4)

首先,一个是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
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏