首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Python cx_oracle绑定变量和项目列表

Python cx_oracle绑定变量和项目列表
EN

Stack Overflow用户
提问于 2018-08-03 19:27:49
回答 2查看 4.3K关注 0票数 5

我有一个类似这样的查询:

代码语言:javascript
复制
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绑定的代码如下:

代码语言:javascript
复制
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}我尝试了多种不同的方法,例如:

代码语言:javascript
复制
prod_names = ''.join(prod_names) 
prod_names = str(prod_names)
prod_names =." \'"+''.join(prod_names)+"\'"

我能让它工作的唯一一件事是:

代码语言:javascript
复制
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包含:

代码语言:javascript
复制
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

我希望能够做一个类型绑定。

我正在使用:

  • python = 3.6
  • cx_oracle = 6.3.1

我已经阅读了下面的文章,但我仍然找不到解决方案:

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-12-21 18:03:00

我终于设法做了这件事。它可能不是很漂亮,但它是有效的。

我已经修改了我的sql查询,以包括一个额外的select,它返回我的描述符列表的值:

代码语言:javascript
复制
inner join (
   SELECT regexp_substr(:my_list_of_items, '[^,]+', 1, LEVEL) as mylist
   FROM dual
   CONNECT BY LEVEL <= length(:my_list_of_items) - length(REPLACE(:my_list_of_items, ',', '')) + 1
) d
on d.mylist= a.corresponding_columns
票数 0
EN

Stack Overflow用户

发布于 2018-08-04 05:54:56

不幸的是,除非将数组转换为SQL类型并使用子查询,否则不能直接绑定数组--这相当复杂。因此,您需要这样做:

代码语言:javascript
复制
inClauseParts = []
for i, inValue in enumerate(ARRAY_VALUE):
    argName = "arg_" + str(i + 1)
    inClauseParts.append(":" + argName)
clause = "%s in (%s)" % (columnName, ",".join(inClauseParts))

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

希望这已经足够清楚了!

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51671617

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档