使用Postgres 9.6.1,sqlalchemy 1.1.4和psycopg2 2.6.2:
将数据结构转换为字典。从Pandas中可以这样做:
import pandas
from sqlalchemy import MetaData
from sqlalchemy.dialects.postgresql import insert
import psycopg2
insrt_vals = df.to_dict(orient='records')
通过Sqlalchemy连接到数据库。相反,尝试在下面使用psycog2驱动程序和本机的COPY函数,绕过所有的Postgres索引。
csv_data = os.path.realpath('test.csv')
con = psycopg2.connect(database = 'db01', user = 'postgres')
cur = con.cursor()
cur.execute("\copy stamm_data from '%s' DELIMITER ';' csv header" % csv_data)
con.commit()
执行
results = engine.execute(do_nothing_stmt)
# Get number of rows inserted
rowcount = results.rowcount
警告:
这种方法不能直接处理 NaT
。
全部内容
tst_df = pd.DataFrame({'colA':['a','b','c','a','z', 'q'],
'colB': pd.date_range(end=datetime.datetime.now() , periods=6),
'colC' : ['a1','b2','c3','a4','z5', 'q6']})
insrt_vals = tst_df.to_dict(orient='records')
engine = sqlalchemy.create_engine("postgresql://user:password@localhost/postgres")
connect = engine.connect()
meta = MetaData(bind=engine)
meta.reflect(bind=engine)
table = meta.tables['tstbl']
insrt_stmnt = insert(table).values(insrt_vals)
do_nothing_stmt = insrt_stmnt.on_conflict_do_nothing(index_elements=['colA','colB'])
results = engine.execute(do_nothing_stmt)
使用psycopg2
驱动程序和PostgreSQL中的COPY
命令,可以在处理较大文件(接近1GB)时更快,因为它会关闭所有表索引,无需执行第二步和第三步。
csv_data = os.path.realpath('test.csv')