我有一些代码可以解析一些sql语句。
由于某种原因,cmd_ordered_list
似乎只包含'更新'而不是所有其他语句。在我看来,这条线不能正常工作:
if(cmd in def_ordered_list):
。我错过了一些明显的东西吗?
sql_statements = {}
sql_select = {'select': 'select, *, from, where, and'}
sql_delete = {'delete': 'delete, from, where, and'}
sql_update = {'update': 'update, index, set, where, and'}
sql_insert = {'insert': 'insert, into, source'}
sql_statements.update(sql_select)
sql_statements.update(sql_delete)
sql_statements.update(sql_update)
sql_statements.update(sql_insert)
cmd = "update index employees set col = 'Hello'"
cmd_list = cmd.split()
first_cmd = cmd_list[0] # update
def_ordered_list = sql_statements[first_cmd].split(",")
cmd_ordered_list = []
for cmd in cmd_list:
if(cmd in def_ordered_list):
cmd_ordered_list.append(cmd)
print def_ordered_list
print cmd_ordered_list # only contains 'update' ?? why?
答案 0 :(得分:3)
您的输入包含空格:
>>> 'update, index, set, where, and'.split(',')
['update', ' index', ' set', ' where', ' and']
请注意index
,set
,where
和and
之前的空格。在列表成员资格时,您从不考虑这些空格;你应该先剥掉那些。或者更好的是,不要将这些选项存储为字符串。
如果您在sql_statements
映射中存储集,则可以避免分割问题,并且作为额外奖励,会员资格测试方式比使用列表更快:
sql_statements = {
'select': {'select', '*', 'from', 'where', 'and'},
'delete': {'delete', 'from', 'where', 'and'},
'update': {'update', 'index', 'set', 'where', 'and'},
'insert': {'insert', 'into', 'source'},
}
创建有序列表就像这样简单:
cmd = "update index employees set col = 'Hello'"
cmd_list = cmd.split()
cmd_ordered_list = [s for s in cmd_list[] if s in sql_statements[cmd_list[0]]]