python where语句_解析sqlselect语句以获取python中的where子句条件

这是因为在关键字和比较中,树结构是不同的。例如,比较包括树中它下面的整个表达式。在

如果使用parsed[0]._pprint_tree(),则可以看到嵌套在比较节点下的所有内容:|- 2 Comparison 'employ...'

| |- 0 Identifier 'employ...'

| | `- 0 Name 'employ...'

| |- 1 Whitespace ' '

| |- 2 Comparison '='

| |- 3 Whitespace ' '

| `- 4 Single ''Emplo...'

但是,NOT IN子句是一系列顺序节点:

^{pr2}$

最好的办法是观察标识符,然后向前跳并保存下一个括号节点的值。虽然这并不能处理所有可能的情况,但它确实处理您的SQL语句并返回job_profile_id的值。在

这是我修改过的代码:import sqlparse

s = "select count(*) from users where employee_type = 'Employee' AND (employment_status = 'Active' OR employment_status = 'On Leave') AND (time_type='Full time' OR country_code <> 'US') AND hire_date < NOW() AND email_work IS NOT NULL AND LENGTH(email_work) > 0 AND NOT (job_profile_id IN ('8802 - Comm Ops - 1', '8801 - CityOps - 2', '10034', '10455', '21014', '21015', '21016', '21018', '21017', '21019') AND country_code = 'IE') AND job_profile_id NOT IN ('20992', '20993', '20994', '20995', '20996', '20997') AND country_code NOT IN ('CN', 'MO', 'SG', 'MY', 'TH', 'VN', 'MM', 'KH', 'PH', 'ID')"

parsed = sqlparse.parse(s)

where = parsed[0][-1]

sql_tokens = []

def get_tokens(where):

identifier = None

for i in where.tokens:

try:

name = i.get_real_name()

if name and isinstance(i, sqlparse.sql.Identifier):

identifier = i

elif identifier and isinstance(i, sqlparse.sql.Parenthesis):

sql_tokens.append({

'key': str(identifier),

'value': token.value

})

elif name:

identifier = None

# sql_tokens.append("{0} - {1} - {2}".format(str(i), str(name), i.value))

sql_tokens.append({

'key': str(name),

'value': u''.join(token.value for token in i.flatten()),

})

else:

get_tokens(i)

except Exception as e:

pass

get_tokens(where)

print sql_tokens

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值