在python中使用pyodbc获取MSSQL表列名

时间:2016-01-08 13:14:59

标签: python sql-server pyodbc

我试图使用pyodbc获取mssql表列名,并收到错误说

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)

如何解决这个问题?

3 个答案:

答案 0 :(得分:4)

您可以通过使用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)

这将返回列名(和其他列元数据)。我相信列名是每行的第四个元素。这也减轻了对SQL注入的非常有效的担忧。然后,您可以了解如何根据结果数据构建DataFrame

祝你好运!

答案 1 :(得分:0)

你的行

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

会产生类似

的东西
USE[databasename]SELECT ...

在SSMS中这可行,但我建议查看正确的间距并将USE语句与分号分开:

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

答案 2 :(得分:0)

  1. 在构建connection string

  2. 时使用Database属性设置数据库上下文
  3. parameters随时使用passing user input (especially from HTTP requests!) to a WHERE clause

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