【发布时间】:2017-10-27 10:41:31
【问题描述】:
我正在开发一个 django 网站,我正在尝试使用从遗留数据库中转储的数据来为 django 创建 YAML 固定装置。
我正在使用正则表达式编写一个粗略的 SQL 解析器(我知道,我知道 .. 但我找不到任何可以帮助我快速做到这一点的东西,所以我必须“自己动手”——除非有更好的建议)。
“滚动我自己”解决方案的一部分是解析 SQL 语句 - 这些是自动生成的,因此语句的格式不会改变。
这里有两个示例INSERT 语句:
INSERT INTO ref_geographic_region (continent_id,name) VALUES(8,'Europe (Western)');
INSERT INTO ref_currency_group (name) VALUES('Major');
我想将 SQL 语句理解为以下模式:
INSERT INTO <table_name> VALUES (one_or_more_alphanums_separated_by_comma);
然后我需要匹配以下值:
- 表名
- one_or_more_alphanums_separated_by_comma
这是我的正则表达式模式。它是匹配的,但分组不是我想要的。
pattern_string = r"INSERT INTO ([a-zA-Z\_]+)\s\(((([a-zA-Z\_]+)(\,)*)+)\)\s+VALUES\(([0-9]*)|([a-zA-Z\(\)']+)(\,)*\;"
如何修改(和简化)上述模式,使其仅匹配我感兴趣的标记?
【问题讨论】:
-
这不是对这个问题的直接回答——你可能已经尝试过了,但发现它不够——但是会将那个 SQL 加载到数据库中,running inspectdb on the database to get an initial Django model file,然后使用
dumpdata把它变成固定装置有帮助吗? -
考虑编写解析器而不是滥用正则表达式捕获组。我在这里回答了一个类似的问题:stackoverflow.com/questions/42435114/…。如果这有帮助,那就太好了。如果没有,请告诉我,我会看看是否可以为您尝试制作的语言编写语法。