我正在尝试将argv [0]作为变量添加到下面的SQL查询并运行到下面的编译错误,修复此问题的语法是什么?
#!/usr/bin/python
import pypyodbc as pyodbc
from sys import argv
component_id=argv[0]
server_name='odsdb.company.com'
database_name='ODS'
cnx = pyodbc.connect("DRIVER={SQL Server};SERVER="+server_name+";DATABASE="+database_name)
db_cursor=cnx.cursor()
SQL = 'SELECT Top 1 cr.ReleaseLabel ' + \
'FROM [ODS].[v000001].[ComponentRevisions] cr ' + \
'WHERE cr.ComponentId=' + component_id + \
'ORDER BY cr.CreatedOn DESC'
resp_rows_obj=db_cursor.execute(SQL)
print '('+', '.join([column_heading_tuple[0] for column_heading_tuple in resp_rows_obj.description])+')'
for row in resp_rows_obj:
print row
错误: -
pypyodbc.ProgrammingError: (u'42000', u"[42000] [Microsoft][ODBC SQL Server Driver][SQL Server]Incorrect syntax near the keyword 'BY'.")
答案 0 :(得分:4)
不要使用字符串插值。使用SQL参数;这些是查询中的占位符,您的数据库将插入值:
SQL = '''\
SELECT Top 1 cr.ReleaseLabel
FROM [ODS].[v000001].[ComponentRevisions] cr
WHERE cr.ComponentId = ?
ORDER BY cr.CreatedOn DESC
'''
resp_rows_obj = db_cursor.execute(SQL, (component_id,))
?
占位符的值来自cursor.execute()
函数的第二个参数,即一系列值。这里你只有一个值,所以我使用了单元素元组。
请注意,您可能需要argv[1]
,不 argv[0]
;后者是脚本名称,而不是第一个参数。
答案 1 :(得分:0)
检索第一个命令行参数do component_id=argv[1]
而不是0,这是脚本名称...
更好的是,请查看argparse
答案 2 :(得分:0)
我们在数据库名称中有一个连字符,用于从Python代码调用的T-SQL查询中。所以我们只添加了方括号,因为SQL Server无法在没有它们的情况下插入连字符。
在:
SELECT * FROM DBMS-NAME.dbo.TABLE_NAME
后:
SELECT * FROM [DBMS-NAME].dbo.TABLE_NAME