import psycopg2
conn = psycopg2.connect(host=***, port=***, database=***, user=***, password=***)
cur = conn.cursor()
     cur.execute("select to_regclass(" + "\'" +  table_name + "\'" + ") is not null")
     rows = cur.fetchall()
except Exception as e:
     rows = []
     conn.close()
if rows:
     data = rows
     flag = data[0][0]
     print(flag)   

flag的值即为查询出来的表是否存在的状态,存在则为True,不存在则为False
利用python在数据库创建表的例子网上很多,在此就不进行赘述了。

  1. executemany()方法批量输入数据到数据库
    data是需要插入的数据,为list类型,3列,数据条数有70多万条
import psycopg2
conn = psycopg2.connect(host=***, port=***, database=***, user=***, password=***)
cur = conn.cursor()
sql =  "insert into " + table_name + " values(%s, %s, %s)"
cur.executemany(sql, data)
conn.commit()
conn.close()

该方法下,70多万条数据插入到数据库需要3.88分钟

  1. datafame的to_sql()插入数据到数据库
from sqlalchemy import create_engine
result = pd.DataFrame(data)
engine = create_engine('postgresql://user:password@host:port/database')
pd.io.sql.to_sql(result, table_name, engine, index = False, if_exists='append')

该方法下,70多万条数据插入到数据库需要4.42分钟

  1. 强大的copy_from(),是postgresSQ的内置函数
import psycopg2
from sqlalchemy import create_engine
import pandas as pd
import StringIO
from io import BytesIO
data1 = pd.DataFrame(data)
# dataframe类型转换为IO缓冲区中的str类型
output = BytesIO()
data1.to_csv(output, sep='\t', index=False, header=False)
output1 = output.getvalue()
conn = psycopg2.connect(host=***, user=***, password=***, database=***)
cur = conn.cursor()
cur.copy_from(StringIO.StringIO(output1), table_name1, null='',columns=columns)
conn.commit()
cur.close()
conn.close()
print('done')

这儿需要特别记录下,copy_from是默认将\N作为NULL值得,但是to_csv会将None值变为“”字符串,因此需要在copy_from中说明null='',即空字符串就是代表的NULL,找了好久才找到快速解决null值得问题,是中文网站上找到的,确实英文提问英文回答的,应该是两个老外一问一答

在实际使用中又遇到一个问题,查询数据库时,如果字段为int类型,存在空值,python查询出数据后,int类型空值会变成NaN,to_csv时,int类型字段会被修改为float类型的,我的解决方法是在查询sql时将int型字段转换为字符串类型的。

用copy_from()方法,70多万条数据插入到数据库仅仅需要0.06分钟,相比于前两种方法执行效率高太多啦
尝试了多张数据表循环批量插入,之前用executemany()需要15个小时才能插入完成的数据,用copy_from()只需要90分钟左右。相比来说已经很优秀了!

原文地址:https://blog.csdn.net/skye1208/article/details/90264431

原文链接:https://blog.csdn.net/skye1208/article/details/90264431 在批量插入postgresql时想使用同Mysql的语法时发现并不能使用: cursor.executemany("INSERT INTO persons VALUES (%d, %s, %s)",[(1, 'John Smith', 'John Doe'),(2, 'Jane Doe', 'Joe Dog'),(3, 'Mike T.', 'Sarah H.')]) 难道只能写成这样吗? insert into A values(xxxxxxxx),(xxxxxxxx),(xxxxxxxx) 在编写linux驱动程序的时候会用到copy_to_user()和copy_from_user()这两个函数。那这两个函数的作用是什么呢?为了便于理解,我们先来了解一下用户空间和内核空间。 在linux系统,每个进程的运行空间分为内核空间和用户空间。之所以划分成这两个空间,是因为在 CPU 的所有指令,有些指令是非常危险的,如果错用,将导致系统崩溃,比如清内存... 其实在Python可以用来连接PostgreSQL的模块很多,这里比较推荐psycopg2。psycopg2安装起来非常的简单(pip install psycopg2),这里主要重点介绍下如何使用。 连接数据库: import psycopg2 conn = psycopg2.connect(host=10.100.157.168,user=postgres,password=postgres,database=testdb) 连接时可用参数:      dbname – 数据库名称 (dsn连接模式)      database – 数据库名称 事务不可重用:>>> trans = conn.begin()2018-03-29 09:14:33,001 INFO sqlalchemy.engine.base.Engine BEGIN (implicit)>>> trans.commit()2018-03-29 09:14:35,449 INFO sqlalchemy.engine.base.Engine... 1.查询数据库数据表是否存在,不存在则创建 import psycopg2 conn = psycopg2.connect(host=***, port=***, database=***, user=***, password=***) cur = conn.cursor() cur.execute("select to_regclass(" + "\'" + table... copy_from_user和copy_to_user这两个函数相信做内核开发的人都非常熟悉,分别是将用户空间的数据拷贝到内核空间以及将内核空间的数据拷贝到用户空间。这两个函数一般用于系统调用,前者将用户空间参数拷贝到内核,后者将系统用的结果返回到用户空间。 用户空间和内核空间 Linux将地址空间分为用户空间和内核空间,内核文档Documentation/arm64/memory.... pythonpostgresql数据库进行批量高效操作 文章目录pythonpostgresql数据库进行批量高效操作`executemany`与`execute_batch`、`execute_values`对比批量操作测试创建测试数据表创建数据库操作基类创建数据库具体的操作类数据库操作测试代码 这里使用psycopg2库对postgresql进行批量的增删改查操作,批量操作可以使用executemany、execute_batch和execute_values方法。其executemany的效率最 这样将进程的运行空间分为内核空间和用户空间,会大大降低系统崩溃的可能性。由于两个空间是独立的,要实现内核空间与用户空间的数据传递就会用到copy_to_user()和copy_from_user()这两个函数。这两个函数含盖了许多关于内核方面的知识,比如内核关于异常出错的处理.从用户空间拷贝数据到内核时必须非常小心,如果用户空间的数据地址是个非法的地址,或是超出用户空间的范围,或是那些地址还没有被映射到,都可能对内核产生很大的影响,或者被造成系统安全的影响。to:目标地址(内核空间) 可以使用类似这样的命令进行导入: copy target_table_name (field_1, field_2, field_3) from 'C:\sourceData.txt' with ( FORMAT csv, DELIMITER ',', escape '\', header true, quote '"', encoding 'UTF8')