【发布时间】:2019-06-28 03:42:22
【问题描述】:
我编写了一些代码来从 sql server 数据库中读取数据并发现代码工作正常。代码看起来很难看。我希望 export 能给我一些提示并指导如何编写更好的代码。
此代码运行良好。但我担心如果数据库像一百万行一样巨大。将数据附加到 Dict 将花费大量时间。但是我不知道如何提高效率。更重要的是,有没有更好的方法来构建我需要的数据框?我可以不使用字典吗?非常感谢提前。我很期待听到。
import pandas as pd
col=['code','desc','group_n']
Dict={}
for i in range(len(col)):
Dict[col[i]]=[]
with pymssql.connect(server,sqluser,sqlpass,database) as conn:
with conn.cursor() as cursor:
sql = 'select VENDORCODE,VENDORDESCRIPTION,sgp.Name from STATUSCODEMAPPING as mapping
join STATUSCODESET as sset on mapping.STATUSCODESETID=sset.ID
join STATUSCODEGROUP as sgp on sgp.ID=mapping.GROUPID where sset.ID = %d
ORDER BY VENDORCODE'
cursor.execute(sql,(238473))
row = cursor.fetchone()
while row:
#print (str(row[0]) + ': ' + row[1] + ' '+row[2])
[Dict[col[i]].append(row[i]) for i in range(len(row))]
row = cursor.fetchone()
df_scmap=pd.DataFrame(Dict)
df_scmap.set_index(['code'],inplace=True)
df_scmap.info()
<class 'pandas.core.frame.DataFrame'>
Int64Index: 595 entries, 1 to 850903
Data columns (total 2 columns):
desc 595 non-null object
group_n 595 non-null object
dtypes: object(2)
memory usage: 13.9+ KB
【问题讨论】:
-
与其循环遍历行,不如直接使用
df_scmap = pd.read_sql_query(sql, conn, params=(238473,))...? -
是的 fetchall 很方便。但是查询一个包含超过 1000 万行的大表需要很多时间。(至少 SQL Server 脚本需要大量时间和内存)。所以我认为从数据库中循环遍历行(一个或固定大小的行)会更好。
标签: python sql-server pandas pymssql