【发布时间】:2008-11-06 15:57:39
【问题描述】:
我正在尝试编写一个工具,可以将数据库的架构与安装脚本中的 SQL 进行比较。从数据库中获取信息非常简单,但我在解析安装脚本时遇到了一些麻烦。
我使用过一些出现在 Google 上的解析器,但它们似乎有些不完整。理想情况下,我想找到一个开源解析器,它相当稳定并且有一半像样的文档。
另外,我并不真正关心特定于某些数据库的类型和语法。需要检查的数据库非常简单。
【问题讨论】:
我正在尝试编写一个工具,可以将数据库的架构与安装脚本中的 SQL 进行比较。从数据库中获取信息非常简单,但我在解析安装脚本时遇到了一些麻烦。
我使用过一些出现在 Google 上的解析器,但它们似乎有些不完整。理想情况下,我想找到一个开源解析器,它相当稳定并且有一半像样的文档。
另外,我并不真正关心特定于某些数据库的类型和语法。需要检查的数据库非常简单。
【问题讨论】:
General SQL Parser 不错。您可能已经找到它了,但是既然您说 SQL 很简单,它对您没有什么用?
【讨论】:
我用过SQL Compare,非常棒。
您可以运行安装脚本来创建一个新数据库,然后将现有数据库与新数据库进行比较。
【讨论】:
某些数据库,例如 postgresql,可以让您查询当前架构。因此,您可以采取另一个方向:您可以创建 SQL 语句来查询您需要的字段和表,以查看它们是否在数据库的架构中,而不是尝试获取架构并解析 SQL。
这是一个例子:postgresql schema metadata
【讨论】:
SQL Server 或许能够为您完成其中的一些工作。它提供了一个非常好的依赖树,可以通过 SDK 访问。
【讨论】:
说真的,特别是对于简单的数据库,您的 SQL Server 内置了一个很棒的 SQL 解析器。
创建一个架构并加载它。比较数据,然后在完成后删除架构。
如果您害怕运行 DDL,那么也许使用几个轻量级嵌入式服务器中的一个可以为您完成这项工作(如果您运行 Java,则使用 Derby)。
然后你得到解析的 SQL 并像现在一样访问表。
你有数据库,如果可以的话,你也可以利用它。
【讨论】:
如果您有 DDL 来创建表,请解析表名并为此添加一些生成的表名。根据您使用的 SQL 引擎,您有不同的方式来查询架构:
使用 SQLite:
PRAGMA table_info(my_table)
PRAGMA table_info(temporary_my_table)
或者在 MySQL 上:
SELECT table_name, column_name, data_type
FROM information_schema.columns
WHERE table_schema = 'my_schema'
AND (table_name LIKE '%my_table';
【讨论】: