如何在 python 中使用变量作为占位符
how to use variable as placeholder in python
我需要有关 python 中变量的帮助,如果我在 select 查询中给出实际的 table 名称,它们将在 运行 期间获取有效,但是当我尝试变量时它失败了。
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
我可以通过在 perl 中使用 $variable 来做同样的事情,我们在 python 中有什么相同的东西吗?
这使用 Oracle Bind Variable 语法,例如:
my_tablename = "SomeTableName"
cur = connection.cursor()
sql = "SELECT * FROM :tablename"
param = {"tablename": my_tablename}
cur.execute(sql, param)
row = cur.fetchall()
请注意,此处的参数作为字典传递,Oracle DB API 将处理变量的转义和引用,例如您的 table 名称。正如您在上面 link 中所了解的,此方法也比执行字符串的 "hard parse" 快得多。
注意不要使用字符串格式运算符%
,像这样:
cur.execute('SELECT * FROM %s' % my_tablename)
因为它不进行任何转义或引用,而且它很容易发生 SQL 注入之类的事情,(更不用说它的性能较低了)。
感谢 post。这帮助我开发了参数驱动的连接字符串。
当 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 中变量的帮助,如果我在 select 查询中给出实际的 table 名称,它们将在 运行 期间获取有效,但是当我尝试变量时它失败了。
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
我可以通过在 perl 中使用 $variable 来做同样的事情,我们在 python 中有什么相同的东西吗?
这使用 Oracle Bind Variable 语法,例如:
my_tablename = "SomeTableName"
cur = connection.cursor()
sql = "SELECT * FROM :tablename"
param = {"tablename": my_tablename}
cur.execute(sql, param)
row = cur.fetchall()
请注意,此处的参数作为字典传递,Oracle DB API 将处理变量的转义和引用,例如您的 table 名称。正如您在上面 link 中所了解的,此方法也比执行字符串的 "hard parse" 快得多。
注意不要使用字符串格式运算符%
,像这样:
cur.execute('SELECT * FROM %s' % my_tablename)
因为它不进行任何转义或引用,而且它很容易发生 SQL 注入之类的事情,(更不用说它的性能较低了)。
感谢 post。这帮助我开发了参数驱动的连接字符串。
当 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"