在 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,*...
时使用 Database
属性设置数据库上下文
使用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
。
祝你好运!
我正在尝试使用 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,*...
- 时使用
使用parameters any time you are .
Database
属性设置数据库上下文
这些更改消除了对动态 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
。
祝你好运!