gpt4 book ai didi

sql - Python cx_oracle 将变量与项目列表绑定(bind)

转载 作者:行者123 更新时间:2023-12-04 20:13:48 25 4
gpt4 key购买 nike

我有一个这样的查询:

SELECT prodId, prod_name , prod_type FROM mytable WHERE prod_type in (:list_prod_names)

我想获取一个产品的信息,取决于可能的类型是: "day", "week", "weekend", "month" .根据日期的不同,它可能至少是这些选项中的一个,或者是所有选项的组合。

此信息(列表类型)由函数 prod_names(date_search) 返回

我正在使用 cx_oracle 绑定(bind),代码如下:
def get_prod_by_type(search_date :datetime):

query_path = r'./queries/prod_by_name.sql'
raw_query = open(query_path).read().strip().replace('\n', ' ').replace('\t', ' ').replace(' ', ' ')

print(sql_read_op)
# Depending on the date the product types may be different
prod_names(search_date) #This returns a list with possible names
qry_params = {"list_prod_names": prod_names} # See attempts bellow
try:
db = DB(username='username', password='pss', hostname="localhost")
df = db.get(raw_query,qry_params)
except Exception:
exception_error = traceback.format_exc()
exception_error = 'Exception on DB.get_short_cov_op2() : %s\n%s' % exception_error
print(exception_error)
return df

为此: qry_params = {"list_prod_names": prod_names}我尝试了多种不同的方法,例如:
prod_names = ''.join(prod_names) 
prod_names = str(prod_names)
prod_names =." \'"+''.join(prod_names)+"\'"

我设法让它工作的唯一一件事就是:
new_query = raw_query.format(list_prod_names=prodnames_for_date(search_date)).replace('[', '').replace(']','')

df = db.query(new_query)

我试图不使用 .format()因为对 sql 执行 .format 以防止攻击是不好的做法。
db.py包含其他功能:
def get(self, sql, params={}):
cur = self.con.cursor()
cur.prepare(sql)
try:
cur.execute(sql, **params)
df = pd.DataFrame(cur.fetchall(), columns=[c[0] for c in cur.description])
except Exception:
exception_error = traceback.format_exc()
exception_error = 'Exception on DB.get() : %s\n%s' % exception_error
print(exception_error)
self.con.rollback()
cur.close()
df.columns = df.columns.map(lambda x: x.upper())
return df

我希望能够进行类型绑定(bind)。

我在用:
  • python = 3.6
  • cx_oracle = 6.3.1

  • 我已阅读以下文章,但我仍然无法找到解决方案:
  • Python cx_Oracle bind variables
  • Python cx_Oracle SQL with bind string variable
  • Search for name in cx_Oracle
  • 最佳答案

    不幸的是,除非将数组转换为 SQL 类型并使用子查询,否则无法直接绑定(bind)数组——这相当复杂。因此,您需要执行以下操作:

    inClauseParts = []
    for i, inValue in enumerate(ARRAY_VALUE):
    argName = "arg_" + str(i + 1)
    inClauseParts.append(":" + argName)
    clause = "%s in (%s)" % (columnName, ",".join(inClauseParts))

    这可以正常工作,但请注意,如果数组中的元素数量定期更改,则使用此技术将创建一个单独的语句,必须针对每个元素数量进行解析。如果您知道(通常)数组中的元素不会超过(例如)10 个,那么最好将 None 附加到传入数组,以便元素的数量始终为 10。

    希望这足够清楚!

    关于sql - Python cx_oracle 将变量与项目列表绑定(bind),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51671617/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com