如何将变量添加到SQL查询?

时间:2014-05-28 22:07:42

标签: python pyodbc

我正在尝试将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'.")

3 个答案:

答案 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