1)将string或者list类型的数据转换为IO缓冲区中的str类型(指定格式)
2)利用PostgreSQL中的copy_from 和copy_to函数将IO缓冲区中的str类型数据写入数据库中。
1)写入数据类型为list时
'''
功能:将list数据类型多条记录一次写入数据库中
数据示例:[[1, 2, 3, 4, 5, 6, 7], [1, 2, 3, 4, 5, 6, 7]]
'''
import psycopg2
import pandas as pd
from io import StringIO
# 创建一个示例list
data = [[1, 2, 3, 4, 5, 6, 7], [1, 2, 3, 4, 5, 6, 7]]
# 将list转换为DataFrame类型
data1 = pd.DataFrame(data)
# 创建一个内存对象f,StringIO为存储在内存中的文件,格式为满足文件的任意格式
f = StringIO()
# DataFrame 类型数据转换为IO缓冲区中的str类型
data1.to_csv(f, sep='\t', index=False, header=False)
# 把f的游标移到第一位,write方法后,游标会变成最尾,使用StringIO(**)则不会
f.seek(0)
# 连接数据库
conn = psycopg2.connect(host='127.0.0.1', user="postgres", password="123456", database="postgres")
# 创建游标
cur = conn.cursor()
# 将内存对象f中的数据写入数据库,参数columns为所有列的元组
cur.copy_from(f, 'tb_user', columns=('id', 'userame', 'passwd', 'roleid', 'lasttime', 'failnum', 'info'))
# 提交
conn.commit()
cur.close()
conn.close()
print('成功写入数据库')
2)写入数据类型为str时
'''
功能:将1000条如下结构的数据记录一次写入数据库中
数据示例:
0 aaa 13434 1 2020-01-11 1 2
...
'''
import psycopg2
from io import StringIO
if __name__ == '__main__':
s = ""
# 循环创建一个字符串,把数据库每一条数据作为一行
for i in range(0, 5):
# 创建一条数据库记录,记录中每个字段间隔符为table(制表符\t)每一行用换行符\n 隔开下一行
s += str(i)+"\taaa\t13434\t1\t2020-01-11\t1\t2\n"
# 创建一个内存对象f,StringIO为存储在内存中的文件,格式为满足文件的任意格式
f = StringIO()
# 将s数据字符串写入内存
f.write(s)
# 把f的游标移到第一位,write方法后,游标会变成最尾,使用StringIO(**)则不会
f.seek(0)
# 连接数据库
conn = psycopg2.connect(host='127.0.0.1', user="postgres", password="123456", database="postgres")
# 创建游标
cur = conn.cursor()
# 将内存对象f中的数据写入数据库,参数columns为所有列的元组
cur.copy_from(f, 'tb_user', columns=('id', 'userame', 'passwd', 'roleid', 'lasttime', 'failnum', 'info'))
# 提交
conn.commit()
# 关闭游标
cur.close()
# 关闭数据库连接
conn.close()
print('成功写入数据库')