我有一个大约有10万行的postgres表。我提取了这个数据集并应用了一些转换,从而产生了一个包含100K行的新pandas数据帧。现在我想将此数据帧作为数据库中的新表加载。我使用to_sql
使用SQLAlchemy连接将数据帧转换为postgres表。但是,这非常慢,需要几个小时。如何使用SQLAlchemy加速数据帧插入数据库表?我想将插入速度从几小时提高到几秒?有人可以帮我弄这个吗?
我在Stackoverflow上搜索过其他类似的问题。他们中的大多数将数据转换为csv文件,然后使用copy_from
作为sql。我正在寻找使用带有pandas dataframe的SQLAlchemy批量插入语句的解决方案。
以下是我的代码的小版本:
from sqlalchemy import *
url = 'postgresql://{}:{}@{}:{}/{}'
url = url.format(user, password, localhost, 5432, db)
con = sqlalchemy.create_engine(url, client_encoding='utf8')
# I have a dataframe named 'df' containing 100k rows. I use the following code to insert this dataframe into the database table.
df.to_sql(name='new_table', con=con, if_exists='replace')
答案 0 :(得分:0)
如果熊猫版本高于0.24,请尝试以下模型
对于支持从io import StringIO导入CSV的COPY的数据库的替代to_sql()方法
def psql_insert_copy(表,conn,键,data_iter): #获取可以提供游标的DBAPI连接 dbapi_conn =连接 使用dbapi_conn.cursor()作为cur: s_buf = StringIO() writer = csv.writer(s_buf) writer.writerows(data_iter) s_buf.seek(0)
columns = ', '.join('"{}"'.format(k) for k in keys) if table.schema: table_name = '{}.{}'.format(table.schema, table.name) else: table_name = table.name sql = 'COPY {} ({}) FROM STDIN WITH CSV'.format( table_name, columns) cur.copy_expert(sql=sql, file=s_buf)
chunksize = 10 4#它取决于您的服务器配置。对于我的情况10 4〜10 ** 5是可以的。 df.to_sql('tablename',con = con,if_exists ='replace',method = psql_insert_copy,chunksize = chunksize)
如果您在上述psql_insert_copy模式下使用并且Postgresql服务器正常工作,则应该享受飞行速度。