【问题标题】:Retrieving Data from SQL Using pyodbc使用 pyodbc 从 SQL 中检索数据
【发布时间】:2012-07-12 03:50:23
【问题描述】:

我正在尝试使用 pyodbc 从 SQL 服务器检索数据并使用 Python 将其打印到表中。但是,我似乎只能检索列名和数据类型之类的东西,而不是列的每一行中的实际数据值。

基本上,我正在尝试复制一个检索服务器数据并将其显示在表格中的 Excel 工作表。我连接到服务器没有任何问题,只是我似乎无法找到进入表格的实际数据。

这是我的代码示例:

import pyodbc
cnxn = pyodbc.connect('DRIVER={SQL Server};SERVER=SQLSRV01;DATABASE=DATABASE;UID=USER;PWD=PASSWORD')
cursor = cnxn.cursor()

cursor.execute("SELECT * FROM sys.tables")
tables = cursor.fetchall()
#cursor.execute("SELECT WORK_ORDER.TYPE,WORK_ORDER.STATUS, WORK_ORDER.BASE_ID, WORK_ORDER.LOT_ID FROM WORK_ORDER")

for row in cursor.columns(table='WORK_ORDER'):
    print row.column_name
    for field in row:
        print field

然而,这个结果只是给了我一些东西,比如表名、列名、一些整数和“无”以及我不感兴趣的东西:

STATUS_EFF_DATE
DATABASE
dbo
WORK_ORDER
STATUS_EFF_DATE
93
datetime
23
16
3
None
0
None
None
9
3
None
80
NO
61

所以我不确定在哪里可以获取填满表格的值。它应该在 table='WORK_ORDER' 中,但它可以在不同的表名下吗?有没有办法打印我刚刚丢失的数据?

任何意见或建议将不胜感激。

【问题讨论】:

  • 为什么不直接运行cursor.execute('select * from WORK_TABLE')?

标签: python sql sql-server pyodbc


【解决方案1】:

你们好亲密!

import pyodbc
cnxn = pyodbc.connect('DRIVER={SQL Server};SERVER=SQLSRV01;DATABASE=DATABASE;UID=USER;PWD=PASSWORD')
cursor = cnxn.cursor()

cursor.execute("SELECT WORK_ORDER.TYPE,WORK_ORDER.STATUS, WORK_ORDER.BASE_ID, WORK_ORDER.LOT_ID FROM WORK_ORDER")
for row in cursor.fetchall():
    print row

(“columns()”函数收集命名表中列的元数据,而不是实际数据)。

【讨论】:

  • 此代码对我不起作用,因为我收到 pyodbc.ProgrammingError: No results. Previous SQL was not a query. 错误。我已经确认 SQL 代码在 Rapid SQL 中有效。
  • “以前的 SQL 不是查询”——这就是线索。在 "cursor.fetchall()" 之前使用 "cursor.execute()" 运行的最后一件事是什么。 (您最好提出一个新问题,以便展示您的代码。)
【解决方案2】:

为了接收存储在表中的实际数据,您应该使用 fetch...() 函数之一或将游标用作迭代器(即“for row in cursor”...)。这在documentation 中有描述:

cursor.execute("select user_id, user_name from users where user_id < 100")
rows = cursor.fetchall()
for row in rows:
    print row.user_id, row.user_name

【讨论】:

    【解决方案3】:

    您可以尝试使用 Pandas 检索信息并将其作为数据框获取

    import pyodbc as cnn
    import pandas as pd
    
    cnxn = pyodbc.connect('DRIVER={SQL Server};SERVER=SQLSRV01;DATABASE=DATABASE;UID=USER;PWD=PASSWORD')
    
    # Copy to Clipboard for paste in Excel sheet
    def copia (argumento):
        df=pd.DataFrame(argumento)
        df.to_clipboard(index=False,header=True)
    
    
    tableResult = pd.read_sql("SELECT * FROM YOURTABLE", cnxn) 
    
    # Copy to Clipboard
    copia(tableResult)
    
    # Or create a Excel file with the results
    df=pd.DataFrame(tableResult)
    df.to_excel("FileExample.xlsx",sheet_name='Results')
    

    我希望这会有所帮助! 干杯!

    【讨论】:

      【解决方案4】:

      不要使用 pyodbc 库,而是使用 pypyodbc 库...这对我有用。

      import pypyodbc
      
      conn = pypyodbc.connect("DRIVER={SQL Server};"
                          "SERVER=server;"
                          "DATABASE=database;"
                          "Trusted_Connection=yes;")
      
      cursor = conn.cursor()
      cursor.execute('SELECT * FROM [table]')
      
      for row in cursor:
          print('row = %r' % (row,))
      

      【讨论】:

        【解决方案5】:

        这样做:

        import pandas as pd
        import pyodbc
        
        cnxn = pyodbc.connect("Driver={SQL Server}\
                            ;Server=SERVER_NAME\
                            ;Database=DATABASE_NAME\
                            ;Trusted_Connection=yes")
        
        df = pd.read_sql("SELECT * FROM myTableName", cnxn) 
        df.head()
        

        【讨论】:

          【解决方案6】:

          赞成的答案对我不起作用,它已通过编辑连接线修复如下(用逗号替换分号并删除那些引号):

          import pyodbc
          cnxn = pyodbc.connect(DRIVER='{SQL Server}',SERVER=SQLSRV01,DATABASE=DATABASE,UID=USER,PWD=PASSWORD)
          cursor = cnxn.cursor()
          
          cursor.execute("SELECT WORK_ORDER.TYPE,WORK_ORDER.STATUS, WORK_ORDER.BASE_ID, WORK_ORDER.LOT_ID FROM WORK_ORDER")
          for row in cursor.fetchall():
              print row
          

          【讨论】:

            【解决方案7】:
            import pyodbc
            conn = pyodbc.connect('Driver={SQL Server};'
                              'Server=db-server;'
                              'Database=db;'
                              'Trusted_Connection=yes;')
            sql = "SELECT * FROM [mytable] "
            cursor.execute(sql)
            for r in cursor:
                print(r)
            

            【讨论】:

            • 欢迎来到 StackOverflow!请edit your answer 并在您的代码中添加解释,解释为什么您编写了您所做的事情,以及它如何等同于或优于此处的其他五个答案。这个问题已有七年的历史,并且已经有一个公认的答案。没有解释的新答案可能会被否决或删除;添加解释将有助于证明您对这个问题的回答是正确的。
            【解决方案8】:

            为什么pyodbc 你可以试试pymssql。欲了解更多信息,请点击此链接:https://stackoverflow.com/a/70445445/8614314。

            import pandas as pd
            import pymssql
            
            con = pymssql.connect(<conncetion to the server and db>)
            cursor = con.cursor()
            query = "<Your query>"
            cursor.execute(query)
            df = pd.read_sql(query, con)
            con.close()
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2021-09-12
              • 2014-08-09
              • 1970-01-01
              • 2015-07-23
              • 2021-12-06
              相关资源
              最近更新 更多