【问题标题】:how to use variable as placeholder in python如何在python中使用变量作为占位符
【发布时间】:2015-09-16 00:29:07
【问题描述】:

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

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 中有什么相同的吗?

【问题讨论】:

  • 您正在运行select * from table,完全按照所写,您需要使用字符串格式来替换变量。试试'select * from %s' %(table)
  • 谢谢布兰登,你分享的细节也有效。

标签: python variables dynamic


【解决方案1】:

这使用Oracle Bind Variable 语法,例如:

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 注入之类的事情(更不用说它的性能较低)。

【讨论】:

    【解决方案2】:

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

    以下参数在运行 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"
    

    【讨论】:

      猜你喜欢
      • 2014-11-29
      • 1970-01-01
      • 1970-01-01
      • 2013-09-07
      • 1970-01-01
      • 2013-01-11
      • 2020-11-16
      • 2017-11-18
      • 1970-01-01
      相关资源
      最近更新 更多