【问题标题】:Pandas DataFrame from pyodbc missing 1 row in result来自pyodbc的Pandas DataFrame在结果中缺少1行
【发布时间】:2021-10-12 12:57:24
【问题描述】:

社区!

在使用 pyodbc 和 pandas 时,我发现了一些至少对我来说很奇怪的东西。 运行程序时,一切都按预期进行,但是我似乎缺少生成的 DataFrame 的一行。

我在 SSMS 中运行了完全相同的查询,结果应该显示 2 行。 将 DataFrame 打印到控制台,我看到它只显示结果行中的后者。

我没看到什么? pd.set_option-part 中的任何设置我做错了吗?我试图改变这些,但到目前为止没有运气。

import tkinter as tk
from tkinter import Tk, W, E
from tkinter.ttk import Frame, Button, Entry, Style, Radiobutton, Label
from tkinter import filedialog as fd
import os


class Application(Frame):

    def __init__(self):
        
        super().__init__()
        self.initUI()
    
    def initUI(self):

        #------------------------------#
        #          Functions           #
        #------------------------------#
        
        def SQL_Query(query_string):
            import pyodbc as p # MIT Lisence. OK
            import itertools
            import pandas as pd # BSD Lisence. OK

            pd.set_option("display.max_rows", None)
            pd.set_option("display.max_columns", None)
            pd.set_option("display.width", 1000)

            databaseName = '***'
            username = '***'
            password = '***'
            server = '***'
            driver = '***'

            CONNECTION_STRING = 'DRIVER='+driver+';SERVER='+server+';DATABASE='+databaseName+';UID='+username+';PWD='+ password

            conn = p.connect(CONNECTION_STRING)

            cursor = conn.cursor()
            cursor.execute(query_string)

            row = cursor.fetchone()     

            desc = cursor.description
            column_names = [col[0] for col in desc]
            data = [dict(zip(column_names, row))  
                for row in cursor.fetchall()]

            conn.close()

            df = pd.DataFrame(data)
            if df.empty == False:
                qty_total = str(df['InitialQuantity'].sum())
                qty_RT = str(df['RT'].sum())

                print('Number of units found with criteria: ' + qty_total)
                print('Numbe rof units with RT:             ' + qty_RT + '\n')
                print(df)
            

            
        def btnRun():
            
            line = var.get()
            mat = varMaterial.get()
            
            if line == "('1', '6', '8', '18')":
                query = f"""QueryStringIsHere"""
                SQL_Query(query)
                
            elif line == "('3', '10')":
                query = f"""QueryStringIsHere"""
                SQL_Query(query)


        #------------------------------#
        # Program title and attributes #
        #------------------------------#
        self.master.title("Production Orders")
        Style().configure("TButton", padding=(0, 5, 0, 5),
            font='serif 10')

        self.columnconfigure(0, pad=3)
        self.columnconfigure(1, pad=3)
        self.columnconfigure(2, pad=3)
        self.columnconfigure(3, pad=3)

        self.rowconfigure(0, pad=3)
        self.rowconfigure(1, pad=3)

        #------------------------------#
        #          UI Elements         #
        #------------------------------#
        
        var = tk.StringVar()            #variable to hold radio button values
        varMaterial = tk.StringVar()
        
        rad12 = Radiobutton(self,text="x", variable=var, value = "('1', '6', '8', '18')").grid(row=0, column=0, sticky=W)
        rad36 = Radiobutton(self,text="y", variable=var, value = "('3', '10')").grid(row=1, column=0, sticky=W)
        
        entry = Entry(self, textvariable=varMaterial).grid(row=2, column=1, columnspan=4, sticky=W+E)
        lblEntry = Label(self, text="Material Number:").grid(row=2, column=0,columnspan=1, sticky=W+E)


        
        #------------------------------#
        #      Command buttons         #
        #------------------------------#
        

        btnSelect = Button(self, text="Run Query", command = btnRun).grid(row=3, column=0)
        btnClear = Button(self, text="Clear text", command = '').grid(row=3, column=1)
        btnQuit = Button(self, text="Quit", command = self.master.destroy).grid(row=3, column=4)


        #------------------------------#
        #           Packing            #
        #------------------------------#
        self.pack()



def main():

    root = Tk()
    app = Application()
    root.mainloop()
  
if __name__ == '__main__':
    main()




   

【问题讨论】:

  • 您能否举一个输出示例(cursor.fetchall() 返回的内容)?
  • 你正在做一个.fetchone() 然后用.fetchall() 填充你的data 变量,所以data 不包括第一行。请注意,您无需调用.fetchone() 即可使用cursor.description
  • 您好,感谢您的指点!删除row = cursor.fetchone() 解决了这个问题,因为我现在用.fetchall() 填充数据,正如你提到的。

标签: python python-3.x pandas pyodbc


【解决方案1】:

在原始帖子中的 cmets 的指导下找到了此问题的解决方案。因为我先做一个.fetchone(),然后用.fetchall() 填充DataFramedata 不包括第一个结果行。

    import tkinter as tk
    from tkinter import Tk, W, E
    from tkinter.ttk import Frame, Button, Entry, Style, Radiobutton, Label
    from tkinter import filedialog as fd
    import os
    
    
    class Application(Frame):
    
        def __init__(self):
            
            super().__init__()
            self.initUI()
        
        def initUI(self):
    
            #------------------------------#
            #          Functions           #
            #------------------------------#
            
            def SQL_Query(query_string):
                import pyodbc as p # MIT Lisence. OK
                import itertools
                import pandas as pd # BSD Lisence. OK
    
                pd.set_option("display.max_rows", None)
                pd.set_option("display.max_columns", None)
                pd.set_option("display.width", 1000)
    
                databaseName = '***'
                username = '***'
                password = '***'
                server = '***'
                driver = '***'
    
                CONNECTION_STRING = 'DRIVER='+driver+';SERVER='+server+';DATABASE='+databaseName+';UID='+username+';PWD='+ password
    
                conn = p.connect(CONNECTION_STRING)
    
                cursor = conn.cursor()
                cursor.execute(query_string)   
    
                desc = cursor.description
                column_names = [col[0] for col in desc]
                data = [dict(zip(column_names, row))  
                    for row in cursor.fetchall()]
    
                conn.close()
    
                df = pd.DataFrame(data)
                if df.empty == False:
                    qty_total = str(df['InitialQuantity'].sum())
                    qty_RT = str(df['RT'].sum())
    
                    print('Number of units found with criteria: ' + qty_total)
                    print('Numbe rof units with RT:             ' + qty_RT + '\n')
                    print(df)
                
    
                
            def btnRun():
                
                line = var.get()
                mat = varMaterial.get()
                
                if line == "('1', '6', '8', '18')":
                    query = f"""QueryStringIsHere"""
                    SQL_Query(query)
                    
                elif line == "('3', '10')":
                    query = f"""QueryStringIsHere"""
                    SQL_Query(query)
    
    
            #------------------------------#
            # Program title and attributes #
            #------------------------------#
            self.master.title("Production Orders")
            Style().configure("TButton", padding=(0, 5, 0, 5),
                font='serif 10')
    
            self.columnconfigure(0, pad=3)
            self.columnconfigure(1, pad=3)
            self.columnconfigure(2, pad=3)
            self.columnconfigure(3, pad=3)
    
            self.rowconfigure(0, pad=3)
            self.rowconfigure(1, pad=3)
    
            #------------------------------#
            #          UI Elements         #
            #------------------------------#
            
            var = tk.StringVar()            #variable to hold radio button values
            varMaterial = tk.StringVar()
            
            rad12 = Radiobutton(self,text="x", variable=var, value = "('1', '6', '8', '18')").grid(row=0, column=0, sticky=W)
            rad36 = Radiobutton(self,text="y", variable=var, value = "('3', '10')").grid(row=1, column=0, sticky=W)
            
            entry = Entry(self, textvariable=varMaterial).grid(row=2, column=1, columnspan=4, sticky=W+E)
            lblEntry = Label(self, text="Material Number:").grid(row=2, column=0,columnspan=1, sticky=W+E)
    
    
            
            #------------------------------#
            #      Command buttons         #
            #------------------------------#
            
    
            btnSelect = Button(self, text="Run Query", command = btnRun).grid(row=3, column=0)
            btnClear = Button(self, text="Clear text", command = '').grid(row=3, column=1)
            btnQuit = Button(self, text="Quit", command = self.master.destroy).grid(row=3, column=4)
    
    
            #------------------------------#
            #           Packing            #
            #------------------------------#
            self.pack()
    
    
    
    def main():
    
        root = Tk()
        app = Application()
        root.mainloop()
      
    if __name__ == '__main__':
        main()
    



   

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-10-19
    • 1970-01-01
    • 1970-01-01
    • 2016-08-20
    • 1970-01-01
    • 1970-01-01
    • 2019-02-25
    相关资源
    最近更新 更多