我试图使用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)
如何解决这个问题?
答案 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)
Database
属性设置数据库上下文
parameters随时使用passing user input (especially from HTTP requests!) to a WHERE clause。
这些更改消除了对动态SQL的需求,动态SQL可能不安全且难以维护。