从SELECT语句字符串 - python中识别查询中的列数

时间:2017-09-23 17:01:07

标签: python sql regex cx-oracle

背景

我正在编写一个用python执行查询的脚本,有时候select语句可能不会返回任何值,我需要假设一个空结果为零。因为null结果不包含任何列信息,所以我需要根据select语句本身找到预期的列数。

我试图通过以下方式实现这一目标(请随意提出另一种方法)

假设我有以下内容:

SELECT TO_CHAR('YYYY-MM-DD', DATE), 'some,string info', numbers FROM some_table;

通过我最初的尝试,我解析了SELECT和FROM关键字之间的所有信息,只返回列输入,然后我试着计算逗号的数量:

q = """TO_CHAR('YYYY-MM-DD',DATE), 'some,string info', numbers"""
commas = q.count(',')
print 'number of commas = ', commas
  

逗号数量= 4

我假设#commas + 1 = #columns,但是额外的逗号会使这个假设变得无用。

问题

是否可以使用正则表达式提取未用引号或括号括起来的逗号?有没有更简单的方法来查找SELECT语句中预期的列数?

2 个答案:

答案 0 :(得分:1)

您可以检查名为description的cursor属性。这将包含有关列的元数据,无论查询是否返回任何数据!

答案 1 :(得分:0)

我不是python专家,因此请将任何python解决方案留给专家。

通过SQL,你可以实现你想要的,虽然它非常棘手/ hacky和丑陋:

我们的想法是创建一个虚拟表并与您的表进行左连接:

create table dummy(dummy_value int);   // This needs to be done only once.

insert into dummy values(0);  // This needs to be done only once.

select YOUR_COLUMNS, dummy_value from (select dummy_value from dummy)dt LEFT OUTER JOIN YOUR_TABLE on 1=1;  // Modify your select queries like this/ Modify the script which creates query to add left outer join like this in all select queries

sqlfiddle

假设您可以在查询创建部分进行更改。