最近工作中开始使用PG库了,由于python中PG库的属性没有cursor属性设置(暂时没查到,问了大佬也说不知道),所以在字段比较多的时候不能像Mysql一样用Dictcursor直接用字典形式导出数据,所以学习了一个小方法,记录一下。
#连接数据库
def get_ptsql_con():
return psycopg2.connect(host='a', port=xxxx, user='b', password='c', database='d')
#建立游标
conn = get_pgsql_con()
cursor = conn.cursor()
#查询数据
sql = "SELECT * FROM tmp_table WHERE id = 'xxxx' and id is not Null"
cursor.execute(sql)
#使用列表推到的形式简洁直观
coloumns = [row[0] for row in cursor.description]
result = [[str(item) for item in row] for row in cursor.fetchall()]
dict_result = [dict(zip(coloumns, row)) for row in result]
with open(ouput_file, 'wb') as f1:
writer1 = csv.DictWriter(f1, coloumns)
writer1.writeheader()
writer1.writerows(dict_result)
cursor.close()
conn.close()
记录以下知识点:
1.cursor的属性中有rowcount和description两个属性:
①.cursor.rowcount可以直接获得记录数,用len()就像csv.reader之后len(reader)一样,内存可能会溢出;
②.cursor.description元组套元组形式的所以才有coloumns=[row[0] for row in cursor.description]
cursor.description = [coloumn(name=,type_code=)],所以拆包获取其中的列表信息
2.获取结果的列表推到很简单就不详细记录了,就是拆包的组合。
3.将结果写成字典形式,字典就是键值的映射,以前我只是在循环中使用zip可以同行读取多个可迭代对象的信息(ZIP太多对象的话效率非常差,数据量大会极大的降低运行效率,不建议使用)
所以这里可以直接用dict(zip(iter1.iter2))就可以获取一列的字典形式数据,再拆包结果后就有所有的字典形式结果信息了