【问题标题】:Read data from pyodbc to pandas从 pyodbc 读取数据到 pandas
【发布时间】:2016-10-03 16:01:04
【问题描述】:

我正在查询一个 SQL 数据库,我想使用 pandas 来处理数据。但是,我不确定如何移动数据。下面是我的输入和输出。

import pyodbc
import pandas
from pandas import DataFrame

cnxn = pyodbc.connect(r'DRIVER={Microsoft Access Driver (*.mdb, *.accdb)};DBQ=C:\users\bartogre\desktop\CorpRentalPivot1.accdb;UID="";PWD="";')
crsr = cnxn.cursor()
for table_name in crsr.tables(tableType='TABLE'):
    print(table_name)
cursor = cnxn.cursor()
sql = "Select sum(CYTM), sum(PYTM), BRAND From data Group By BRAND"
cursor.execute(sql)
for data in cursor.fetchall():
    print (data)

('C:\\users\\bartogre\\desktop\\CorpRentalPivot1.accdb', None, 'Data', 'TABLE', None)
('C:\\users\\bartogre\\desktop\\CorpRentalPivot1.accdb', None, 'SFDB', 'TABLE', None)
(Decimal('78071898.71'), Decimal('82192672.29'), 'A')
(Decimal('12120663.79'), Decimal('13278814.52'), 'B')

【问题讨论】:

  • 我刚刚想通了。请看答案。

标签: python pandas pyodbc


【解决方案1】:

更简短的答案

import pyodbc
import pandas as pd

cnxn = pyodbc.connect(r'DRIVER={Microsoft Access Driver (*.mdb, *.accdb)};'
                      r'DBQ=C:\users\bartogre\desktop\data.mdb;')
sql = "Select sum(CYTM), sum(PYTM), BRAND From data Group By BRAND"
data = pd.read_sql(sql,cnxn)  # without parameters [non-prepared statement]

# with a prepared statement, use list/tuple/dictionary of parameters depending on DB
#data = pd.read_sql(sql=sql, con=cnxn, params=query_params) 

【讨论】:

    【解决方案2】:

    我想太多了!

    cnxn = pyodbc.connect(r'DRIVER={Microsoft Access Driver (*.mdb, *.accdb)};DBQ=C:\users\bartogre\desktop\CorpRentalPivot1.accdb;UID="";PWD="";')
    crsr = cnxn.cursor()
    for table_name in crsr.tables(tableType='TABLE'):
        print(table_name)
    cursor = cnxn.cursor()
    sql = "Select sum(CYTM), sum(PYTM), BRAND From data Group By BRAND"
    cursor.execute(sql)
    data = cursor.fetchall()
    print(data)
    Data = pandas.DataFrame(data)
    print(Data)
    

    【讨论】:

    • 这不是把所有东西都吐到一列吗?!
    【解决方案3】:

    另一种更快的方法。请看data = pd.read_sql(sql, cnxn)

    import pyodbc
    import pandas as pd
    from pandas import DataFrame
    from pandas.tools import plotting
    from scipy import stats
    import matplotlib.pyplot as plt
    import seaborn as sns
    
    cnxn = pyodbc.connect(r'DRIVER={Microsoft Access Driver (*.mdb, *.accdb)}; DBQ=C:\users\bartogre\desktop\data.mdb;UID="";PWD="";')
    crsr = cnxn.cursor()
    for table_name in crsr.tables(tableType='TABLE'):
        print(table_name)
    cursor = cnxn.cursor()
    sql = "Select *"
    sql = sql + " From data"
    print(sql)
    cursor.execute(sql)
    data = pd.read_sql(sql, cnxn)
    

    【讨论】:

    • 我认为这里不需要cursor.execute(sql)
    • 使用 crsr = cnxn.cursor() 到 cursor.execute(sql) 部分,您执行查询 2 次。 data = pd.read_sql(sql, cnxn) 就够了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-10-28
    • 2011-06-30
    • 2021-11-22
    • 1970-01-01
    • 1970-01-01
    • 2016-10-09
    相关资源
    最近更新 更多