如何压缩代码'pymssql查询数据从sql到dataframe'?

Posted

技术标签:

【中文标题】如何压缩代码\'pymssql查询数据从sql到dataframe\'?【英文标题】:How to compact code 'pymssql query data from sql to dataframe'?如何压缩代码'pymssql查询数据从sql到dataframe'? 【发布时间】: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 脚本需要大量时间和内存)。所以我认为从数据库中循环遍历行(一个或固定大小的行)会更好。 【参考方案1】:

fetchall() 看起来好多了

import pandas as pd
col=['code','desc','group_n']
with pymssql.connect(server,sqluser,sqlpass,database) as conn:
    with conn.cursor() as cursor:
        sql = 'select almhis.ID, almhis.ACTIVETIME, alm.ALARMCODE, alm.VENDORCODE,  coler.NAME
        from dbo.ALARM as alm JOIN dbo.ALARMHISTORY as almhis ON almhis.ALARMID = alm.ID 
        JOIN dbo.CONTROLLER as coler ON coler.ID = alm.CONTROLLERID'
        cursor.execute(sql)
        row = cursor.fetchall()
        df_almhis=pd.DataFrame(row,columns=cols)

【讨论】:

以上是关于如何压缩代码'pymssql查询数据从sql到dataframe'?的主要内容,如果未能解决你的问题,请参考以下文章