Nea*_*ras 3 python sql-server sqlalchemy pyodbc pandas
我来找你是因为我无法解决pandas.DataFrame.to_sql()方法的问题。
我已经在我的脚本和数据库之间建立了连接,我可以发送查询,但实际上它对我来说太慢了。
我想找到一种方法来提高我的脚本的性能。也许有人会找到解决方案?
这是我的代码:
engine = sqlalchemy.create_engine(con['sql']['connexion_string'])
conn = engine.connect()
metadata = sqlalchemy.Metadata()
try :
if(con['sql']['strategy'] == 'NEW'):
query = sqlalchemy.Table(con['sql']['table'],metadata).delete()
conn.execute(query)
Sql_to_deploy.to_sql(con['sql']['table'],engine,if_exists='append',index = False,chunksize = 1000,method = 'multi')
elif(con['sql']['strategy'] == 'APPEND'):
Sql_to_deploy.to_sql(con['sql']['table'],engine,if_exists='append',index = False,chunksize = 1000,method = 'multi')
else:
pass
except Exception as e:
print(type(e))
Run Code Online (Sandbox Code Playgroud)
当我退出 chunksize 和方法参数时,它正在工作,而且太慢了,这一刻它太慢了(30000 行几乎需要 3 分钟)。当我输入这些参数时,我得到一个sqlalchemy.exc.ProgrammingError...
感谢您的帮助 !
因为如果您这样mssql+pyodbc做,您将获得最佳表现to_sql
fast_executemany=True在您的通话中启用create_engine。例如,此代码在我的网络上运行只需 3 秒多一点:
from time import perf_counter
import pandas as pd
import sqlalchemy as sa
ngn_local = sa.create_engine("mssql+pyodbc://mssqlLocal64")
ngn_remote = sa.create_engine(
(
"mssql+pyodbc://sa:_whatever_@192.168.0.199/mydb"
"?driver=ODBC+Driver+17+for+SQL+Server"
),
fast_executemany=True,
)
df = pd.read_sql_query(
"SELECT * FROM MillionRows WHERE ID <= 30000", ngn_local
)
t0 = perf_counter()
df.to_sql("pd_test", ngn_remote, index=False, if_exists="replace")
print(f"{perf_counter() - t0} seconds")
Run Code Online (Sandbox Code Playgroud)
而使用fast_executemany=False(默认)相同的过程需要 143 秒(2.4 分钟)。
| 归档时间: |
|
| 查看次数: |
6564 次 |
| 最近记录: |