我有一个数据框,我想写入Postgres数据库。此功能需要成为Flask app.
现在,我通过创建一个单独的脚本来运行此插入部分SQLAlchemy 引擎并将其传递给df.to_sql()
将数据框写入数据库表。
但是当我将此功能集成到 Flask 应用程序中时,我已经与Postgres使用创建的数据库Psycopg2 连接池.
当被看时df.to_sql()
文档中提到它使用SQLAlchemy 引擎。我没有看到任何其他连接机制。https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.to_sql.html#pandas-dataframe-to-sql
我的问题是,当我拥有现有连接时,为什么需要创建这个 SQLAlchemy 引擎。为什么我不能使用它们?
您可以使用这些连接并避免 SQLAlchemy。这听起来相当不直观,但它会比常规插入快得多(即使您要删除 ORM 并进行一般查询,例如使用executemany
)。即使使用原始查询,插入也很慢,但您会发现COPY
中多次提到如何加快 PostgreSQL 中的插入性能。在这种情况下,我采用以下方法的动机是:
- Use
COPY
代替INSERT
- 不要相信 Pandas 会为此操作生成正确的 SQL(尽管,正如 Ilja Everilä 所指出的,这种方法实际上得到了在 V0.24 中添加到 Pandas)
- 不要将数据写入磁盘来创建实际的文件对象;把一切都记在记忆里
建议使用的方法cursor.copy_from():
import csv
import io
import psycopg2
df = "<your_df_here>"
# drop all the columns you don't want in the insert data here
# First take the headers
headers = df.columns
# Now get a nested list of values
data = df.values.tolist()
# Create an in-memory CSV file
string_buffer = io.StringIO()
csv_writer = csv.writer(string_buffer)
csv_writer.writerows(data)
# Reset the buffer back to the first line
string_buffer.seek(0)
# Open a connection to the db (which I think you already have available)
with psycopg2.connect(dbname=current_app.config['POSTGRES_DB'],
user=current_app.config['POSTGRES_USER'],
password=current_app.config['POSTGRES_PW'],
host=current_app.config['POSTGRES_URL']) as conn:
c = conn.cursor()
# Now upload the data as though it was a file
c.copy_from(string_buffer, 'the_table_name', sep=',', columns=headers)
conn.commit()
这应该比实际执行插入快几个数量级。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)