def dbConnect (db_parm, username_parm, host_parm, pw_parm):
# Parse in connection information
credentials = {'host': host_parm, 'database': db_parm, 'user': username_parm, 'password': pw_parm}
conn = psycopg2.connect(**credentials)
conn.autocommit = True # auto-commit each entry to the database
conn.cursor_factory = RealDictCursor
cur = conn.cursor()
print ("Connected Successfully to DB: " + str(db_parm) + "@" + str(host_parm))
return conn, cur
连接到数据库
conn, cur = dbConnect(databaseName, dbUser, dbHost, dbPwd)
假设 Dataframe 已经作为df存在
output = io.BytesIO() # For Python3 use StringIO
df.to_csv(output, sep='\t', header=True, index=False)
output.seek(0) # Required for rewinding the String object
copy_query = "COPY mem_info FROM STDOUT csv DELIMITER '\t' NULL '' ESCAPE '\\' HEADER " # Replace your table name in place of mem_info
cur.copy_expert(copy_query, output)
conn.commit()
8条答案
按热度按时间zpf6vheq1#
从panda 0.14(2014年5月底发布)开始,支持postgresql。
sql
模块现在使用sqlalchemy
来支持不同的数据库风格。您可以为postgresql数据库传递sqlalchemy引擎(参见文档)。例如:你是对的,在panda 0.13.1之前不支持postgresql。如果你需要使用旧版本的panda,这里有一个补丁版本的
pandas.io.sql
:https://gist.github.com/jorisvandenbossche/10841234.这是我以前写的,所以不能完全保证它总是有效,但是基础应该在那里).如果你把这个文件放在你的工作目录下并导入它,那么你应该能够做到(这里
con
是一个postgresql连接):8yoxcaq72#
更快的选项:
下面的代码将把你的Pandas DF复制到postgres DB,比df.to_sql方法快得多,而且你不需要任何中间的csv文件来存储df。
根据数据库规范创建引擎。
在postgres DB中创建一个表,该表的列数与Dataframe(df)相同。
DF中的数据将被 * 插入 * 到postgres表中。
如果你想替换这个表,我们可以用正常的to_sql方法替换它,使用我们的df中的头,然后把整个耗时的df加载到DB中。
fcipmucu3#
Pandas0.24.0+解决方案
在Pandas 0.24.0中引入了一个新特性,专门用于快速写入Postgres。您可以在这里了解更多:https://pandas.pydata.org/pandas-docs/stable/user_guide/io.html#io-sql-method
6fe3ivhb4#
我就是这么做的。
它可能更快,因为它使用
execute_batch
:5vf7fwbs5#
将df写入自定义模式中带/不带索引的表的更快方法:
如果你的df中有JSON值,那么上面的方法仍然可以正确加载所有数据,但是json列会有一些奇怪的格式。所以将json列转换为
::json
可能会产生错误。你必须使用to_sql()
。添加method=multi
可以加快速度,添加chunksize
可以防止你的机器冻结:pb3skfrl6#
使用psycopg2,您可以使用原生SQL命令将数据写入postgres表。
vmpqdwk37#
适用于Python 2.7和Pandas 0.24.2,并使用Psycopg2
心理学2连接模块
连接到数据库
假设 Dataframe 已经作为df存在
baubqpgj8#
创建引擎(其中方言=“postgres”或“mysql”等):