簡體   English   中英

pyodbc 中的 Pandas DataFrame 結果中缺少 1 行

[英]Pandas DataFrame from pyodbc missing 1 row in result

社區!

在將 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()




   

這個問題的解決方案是在原始帖子評論的指導下找到的。 當我首先執行.fetchone() ,然后使用.fetchall() DataFrame .fetchall()data不包括第一個結果行。

    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()
    



   

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM