如何在python中使用变量作为占位符

如何在python中使用变量作为占位符,python,variables,dynamic,Python,Variables,Dynamic,我需要python中变量的帮助,它们将在运行时获取,如果我在select查询中给出实际的表名,它会工作,但当我尝试变量时,它会失败 import cx_Oracle import csv import sys tablename = sys.argv[1] # pasing it as input at runtime host = 'server.com' port = 7111 SERVICE_NAME = 'gtpts' login = 'USER' passwrd = 'password

我需要python中变量的帮助,它们将在运行时获取,如果我在select查询中给出实际的表名,它会工作,但当我尝试变量时,它会失败

import cx_Oracle
import csv
import sys
tablename = sys.argv[1] # pasing it as input at runtime
host = 'server.com'
port = 7111
SERVICE_NAME = 'gtpts'
login = 'USER'
passwrd = 'password'
SID = 'server.com'
dsn = cx_Oracle.makedsn(host, port, SID).replace('SID','SERVICE_NAME')
con = cx_Oracle.connect(login, passwrd, dsn)

cur = con.cursor()

cur.execute('select * from table') # direct table name works but variable doesnot
row = cur.fetchall()
获取错误如下所示:

[20020663]:20020663> python oracleconnect.py employee
Traceback (most recent call last):
  File "oracleconnect.py", line 16, in <module>
    cur.execute('select * from tablename')
cx_Oracle.DatabaseError: ORA-00911: invalid character
[20020663]:20020663>python oracleconnect.py employee
回溯(最近一次呼叫最后一次):
文件“oracleconnect.py”,第16行,在
cur.execute('select*fromtablename')
cx_Oracle.DatabaseError:ORA-00911:无效字符
我也可以通过在perl中使用$variable来实现这一点。在python中,我们是否有同样的东西。

这使用了语法,例如:

my_tablename = "SomeTableName"
cur = connection.cursor()
sql = "SELECT * FROM :tablename"
param = {"tablename": my_tablename}
cur.execute(sql, param)
row = cur.fetchall()
请注意,这里的参数是作为dict传递的,Oracle DB API将处理变量的转义和引用,例如表名。正如您在上面的链接中所读到的,这种方法也比字符串的“硬解析”快得多

注意不要使用字符串格式运算符
%
,如下所示:

cur.execute('SELECT * FROM %s' % my_tablename)
因为它不进行任何转义或引用,并且容易出现SQL注入之类的情况(更不用说性能较差)。

这使用了语法,例如:

my_tablename = "SomeTableName"
cur = connection.cursor()
sql = "SELECT * FROM :tablename"
param = {"tablename": my_tablename}
cur.execute(sql, param)
row = cur.fetchall()
请注意,这里的参数是作为dict传递的,Oracle DB API将处理变量的转义和引用,例如表名。正如您在上面的链接中所读到的,这种方法也比字符串的“硬解析”快得多

注意不要使用字符串格式运算符
%
,如下所示:

cur.execute('SELECT * FROM %s' % my_tablename)

因为它不做任何转义或引用,而且容易发生SQL注入之类的事情(更不用说它的性能较差)。

谢谢这篇文章。这有助于我开发参数驱动的连接字符串

在运行python脚本时,将传递以下参数,然后python将我记录到数据库中,我可以执行插入

import cx_Oracle
import csv
import sys

host_args = sys.argv[1]
port_args = sys.argv[2]
SID_args = sys.argv[3]
login_args = sys.argv[4]
passwrd_args = sys.argv[5]
data_dir = sys.argv[6]

dsn = cx_Oracle.makedsn(host_args, port_args, SID_args).replace('SID','SERVICE_NAME')
con = cx_Oracle.connect(login_args, passwrd_args, dsn)
在下面的命令中,我在命令行中键入以运行此python脚本

python /dera/ordsDataBranch/nsar/Load_NSARs_to_Oracle.py "myservername" "1521" "devrf1" "hr" "password2016" "/dera/ordsDataBranch/nsar/data"

谢谢你的帖子。这有助于我开发参数驱动的连接字符串

在运行python脚本时,将传递以下参数,然后python将我记录到数据库中,我可以执行插入

import cx_Oracle
import csv
import sys

host_args = sys.argv[1]
port_args = sys.argv[2]
SID_args = sys.argv[3]
login_args = sys.argv[4]
passwrd_args = sys.argv[5]
data_dir = sys.argv[6]

dsn = cx_Oracle.makedsn(host_args, port_args, SID_args).replace('SID','SERVICE_NAME')
con = cx_Oracle.connect(login_args, passwrd_args, dsn)
在下面的命令中,我在命令行中键入以运行此python脚本

python /dera/ordsDataBranch/nsar/Load_NSARs_to_Oracle.py "myservername" "1521" "devrf1" "hr" "password2016" "/dera/ordsDataBranch/nsar/data"

字符串格式?请看您正在完全按照编写的方式运行
select*from table
,您需要使用字符串格式来替换变量。请尝试
“从%s%%(表)
中选择*。谢谢brandon,您共享的详细信息也有效。字符串格式?请看您正在完全按照编写的方式运行
select*from table
,您需要使用字符串格式来替换变量。请尝试从%s%%(表)中选择*。谢谢brandon,您共享的详细信息也很有用。