SQL - 以编程方式比较 sql ddl

Posted

技术标签:

【中文标题】SQL - 以编程方式比较 sql ddl【英文标题】:SQL - Comparing sql ddl programmatically 【发布时间】:2020-02-19 17:41:00 【问题描述】:

我们正在自动化在我们的数据库上创建/修改表的过程。我们将 ddls 保存在 github repo 中。如果定义发生变化,我们的目标是删除并再次创建表。否则,没有变化。

假设我们有一个名为table1 的表

步骤:

1. Query database to get ddl for table1.
2. Get ddl from github repo, check if there is any difference between github & ddl from database server.
3. If there is a difference, drop and create again
4. Else, no change.

对于比较,进行字符串比较是非常幼稚的(空格的变化并不意味着架构的变化)。

是否有任何 API 可供比较?我正在专门寻找 python API。标准 diff 实用程序不能很好地比较 2 个 sql 文件。如果字段顺序不同但整体 ddl 可能相同,它将创建差异。

【问题讨论】:

【参考方案1】:

考虑通过 SQL 解析器运行这两个版本(例如,https://pypi.org/project/sqlparse/ -- 不暗示背书,可能有其他替代方案)并比较两个解析树的元素。

【讨论】:

【参考方案2】:

由于您正在寻找 Python API,您可能需要考虑使用类似 GitPython

为了比较(您的第 2 步),提交文件并让 git 确定是否有任何更改。 编辑:添加到使用 Git 进行比较 (git diff) 给出您对空白的评论,请参阅此answer 以获得指导。

【讨论】:

如果有空格等也无济于事 @user1768610 我已经更新了我的答案,以解决您对空间的担忧。这里有一个类似的问题:***.com/q/33159394/3854195

以上是关于SQL - 以编程方式比较 sql ddl的主要内容,如果未能解决你的问题,请参考以下文章

SQL概念及DDL语句

MySQL中包含数学比较的SQL查询

Hive基础sql语法(DDL)

Oracle SQL 列比较

比较 SQL 数据

初学SQL注入