如何压缩代码'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'?的主要内容,如果未能解决你的问题,请参考以下文章

Pymssql 可以与 MS SQL Server 建立安全连接 (SSL) 吗?

如何使用 pymssql 获取 sql 打印消息

如何修复使用 pymssql 插入 sql DB 的错误

使用 python pymssql 调用 sql server 存储过程

pymssql 不返回结果数据

使用 SQL Alchemy 和 pymssql 指定故障转移伙伴