在 python 中使用 pyodbc 获取 MSSQL table 列名称

Get MSSQL table column names using pyodbc in python

我正在尝试使用 pyodbc 获取 mssql table 列名称,但收到一条错误消息

ProgrammingError: No results.  Previous SQL was not a query.

这是我的代码:

class get_Fields:
   def GET(self,r):
          web.header('Access-Control-Allow-Origin',      '*')
          web.header('Access-Control-Allow-Credentials', 'true')
          fields = []
          datasetname = web.input().datasetName
          tablename = web.input().tableName
          cnxn = pyodbc.connect(connection_string)
          cursor = cnxn.cursor()
          query =  "USE" + "[" +datasetname+ "]" + "SELECT COLUMN_NAME,* FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = " + "'"+ tablename + "'"
          cursor.execute(query)
          DF = DataFrame(cursor.fetchall())
          columns = [column[0] for column in cursor.description]
          return json.dumps(columns)

如何解决这个问题?

你的线路

query =  "USE" + "[" +datasetname+ "]" + "SELECT COLUMN_NAME,*...

会产生类似于

的东西
USE[databasename]SELECT ...

在 SSMS 中这可行,但我建议查看适当的间距并用分号分隔 USE-statement:

query =  "USE " + "[" +datasetname+ "]; " + "SELECT COLUMN_NAME,*...
  1. 在构建 connection string

  2. 时使用 Database 属性设置数据库上下文
  3. 使用parameters any time you are .

这些更改消除了对动态 SQL 的需要,动态 SQL 可能不安全且难以维护。

您可以通过使用 pyodbc 的一些内置方法来避免这种情况。例如,而不是:

    query =  "USE" + "[" +datasetname+ "]" + "SELECT COLUMN_NAME,* FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = " + "'"+ tablename + "'"
    cursor.execute(query)
    DF = DataFrame(cursor.fetchall())

尝试:

    column_data = cursor.columns(table=tablename, catalog=datasetname, schema='dbo').fetchall()
    print(column_data)

这将 return 列名称(和其他列元数据)。我相信列名是每行的第四个元素。这也消除了对 SQL 注入的非常有效的担忧。然后,您可以弄清楚如何根据生成的数据构建 DataFrame

祝你好运!