如何从Python中解析sql文件?

2024-09-30 03:25:47 发布

您现在位置:Python中文网/ 问答频道 /正文

是否有任何方法可以从Python中执行.SQL文件中的某些SQL命令,而不是文件中的所有SQL命令?假设我有以下.sql文件:

DROP TABLE IF EXISTS `tableA`;

CREATE TABLE `tableA`(
some_code
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

DROP TABLE IF EXISTS `tableB`;

CREATE TABLE `tableB`(
some_code
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

DROP TABLE IF EXISTS `tableC`;

CREATE TABLE `tableC`(
some_code
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

...to be continued...

在这个文件中,我只想解析并运行与tableB相关的命令(即删除并创建tableB),但不想在Python中的其他表上执行任何SQL命令。我知道如何在Python中执行.sql文件,但不知道如何在.sql文件中仅执行上面示例中所述的一些特定命令。首先让我想到的是使用正则表达式。但是经过一点争论之后,由于我的regex知识和经验不足,我无法想出正确的regex语法来达到我的预期。

所以我的问题是

1)这里使用正则表达式只获取所需命令的方法正确吗?如果正确,您能告诉我解析它的正确语法吗?

2)如果正则表达式不是最好的方法,那么还有什么其他的解决方案?

3)我发现了一些在线regex测试工具,但它们都是指定表达式和测试字符串,并突出显示字符串中的匹配数据。我相信,如果有一些工具让我先指定测试字符串,然后在字符串中手动突出显示所需的数据,然后反向返回一些适当的语法/表达式,那就太好了。如果你知道这样的工具(没有限制在线工具!如果是Macintosh应用程序,我也很高兴),请告诉我。。。

谢谢。


Tags: 文件方法字符串命令sqlifcreateexists
3条回答

虽然regex可能不是右侧的工具,但您仍然可以使用它。

>>> statements = """
... DROP TABLE IF EXISTS `tableA`;
...
... CREATE TABLE `tableA`(
... some_code
... ) ENGINE=MyISAM DEFAULT CHARSET=latin1;
...
... DROP TABLE IF EXISTS `tableB`;
...
... CREATE TABLE `tableB`(
... some_code
... ) ENGINE=MyISAM DEFAULT CHARSET=latin1;
...
... DROP TABLE IF EXISTS `tableC`;
...
... CREATE TABLE `tableC`(
... some_code
... ) ENGINE=MyISAM DEFAULT CHARSET=latin1;
... """
>>> regex = r"((?:CREATE|DROP) TABLE (?:IF (?:NOT )?EXISTS )?`tableB`(?:[^;]|(?:'.*?'))*;)"
>>> re.findall(regex, statements, re.I)
['DROP TABLE IF EXISTS `tableB`;', 'CREATE TABLE `tableB`(\nsome_code\n) ENGINE=MyISAM DEFAULT CHARSET=latin1;']
>>>

如果你想知道

`(?:[^;]|(?:'.*?'))*`

是,它只用于匹配除;以外的任何字符,任何次数,包括无

字符串文本,这意味着它将允许;在类似'this is a ;value; for a varchar field'的字符串内匹配。

尽管我个人认为您应该使用一些解析库来解析SQL的AST,但是通过查看代码也可以使用此选项:

my_sql_code = '''DROP TABLE...''' #big long string, multiline
statements = my_sql_code.split(';')
statements = [s for s in statements if 'tableB' in s]
for s in statements:
    execute_sql(s)

您可以尝试sqlparse库,它将通过解析SQL语句来简化您的工作,并使您能够查询和使用SQL语句中的标记。在您的例子中,它可以是一个goos基来过滤掉包含特定标记(如tableB)的语句

相关问题 更多 >

    热门问题