将变量添加到python SQL字符串

时间:2015-04-07 15:15:32

标签: python oracle

我已经搜索并尝试了一切可能的方式(我相信)能够将参数传递给我的Pyhton代码中的SQL字符串。我也得到错误: 1. cx_Oracle.DatabaseError:ORA-01036:非法变量名称/号码;要么, 2. typeerror:'str'对象不可调用

以下是我想要做的简单版本。最后,我有一个列表中的字符串名称列表,我希望使用'for'循环,但我想,让我们先使用这个简单的版本。

我已经能够在没有参数替换的情况下使用它。

有什么想法吗?

X = 'XX_Delete'
connection = cx_Oracle.connect('p123/p132.xyz@oratfc01')
cursor = connection.cursor()
#cursor.execute('Create TABLE %s as select * from tsapw_period where diskey = 200', X)
#cursor.execute('Create TABLE %s as select * from tsapw_period where diskey = 200', (X))
#cursor.execute('Create TABLE %s as select * from tsapw_period where diskey = 200', str(X))
#cursor.execute('Create TABLE :s as select * from tsapw_period where diskey = 200', (X))
#cursor.execute('Create TABLE :s as select * from tsapw_period where diskey = 200' %(X))
sql = "Create TABLE :s as select * from tsapw_period where diskey = 200"
param = (X)
cursor.execute(sql, param)

3 个答案:

答案 0 :(得分:0)

尝试(X,),即在X和右括号之间使用逗号,这基本上确保您传入一个元素作为第二个参数。对于元组中的两个或更多元素,您不需要尾随逗号。希望这可以帮助。

答案 1 :(得分:0)

将变量添加到SQL语句中的最佳方法是使用像您尝试的那样准备好的语句。有了这些陈述,用户很难注入错误的代码。

bind Variable Patterns有不同的方法。

对于您的示例,应该是:

cursor.execute('Create TABLE :tab as (select * from tsapw_period where diskey = 200)', tab='foo')

cursor.execute('Create TABLE :0 as (select * from tsapw_period where diskey = 200)', ('foo',))

答案 2 :(得分:0)

显然,我不喜欢以这种方式传递参数。这很有效:

cursor.execute('Create TABLE {} as select * from tsapw_period where diskey = 200'.format(X))