无论主键如何,我如何检查两个关系数据库是否相同?

时间:2010-10-13 17:27:31

标签: database perl sqlite testing relational-database

我有一个约100个表的关系数据库。每个表都有唯一的数字主键和合成值,并且有很多外键可以链接表。表格不大(数十或数百或记录)。这是一个SQLite数据库。

出于测试目的,我需要通过linux脚本比较数据库的两个副本(简单的bash脚本,perl,diff,sed可用)。我需要验证两个数据库的记录数是否相同,并且记录具有相同的内容并转储差异。问题是,只要关系相同,就允许键的值不同。

例如:

有一个表“country”,主键为“ix_country”和“name”,表为“customer”,字段为“name”,主键为“ix_customer”,外键为“ix_country”。

这两个数据库是相同的:第一个数据库:

country:name =“USA”ix_country = 1; customer:name =“Joe”ix_customer = 10 ix_country = 1

第二个数据库:

country:name =“USA”ix_country = 1771; customer:name =“Joe”ix_customer = 27 ix_country = 1771

两个副本都具有相同的结构。

有一种简单的方法吗?

更新

还有一个要求 - 脚本必须能够抵御结构中的变化。如果添加或删除表或字段,它必须有效。

更新2:

我自己开始研究这个问题。一般策略是编写一个创建“身份映射”文件的SQL脚本。该映射包含每个记录的主键值(“人工身份”)和“自然身份”键 - 唯一标识记录的字符串。对于数据库中的某些表,有一个唯一的自然id键(在我的示例中类似于contry名称)。其他表格需要序列中的序号,还有一些表格将其自己的身份与父母身份相结合(如果父母也有父母,则可以递归)。

所有记录都由第二个SQL脚本以标识人工身份的格式转储到第二个文本文件。

perl脚本用地图中的自然身份替换第二个文件中的所有人工身份。

对结果进行排序和区分。

3 个答案:

答案 0 :(得分:5)

  

这是否容易做到

没有。这将需要编程工作。

答案 1 :(得分:3)

如果数据库非常简单,在命令行上运行查询,转储正确格式化的所有数据,没有id,正确排序并与diff进行比较可能会让你有很大的帮助。

e.g。

sqlite3 test.db 'CREATE TABLE Country (id  integer, name varchar(20))'
sqlite3 test.db 'CREATE TABLE Customer (id  integer, name varchar(20), country integer)'
sqlite3 test.db 'insert into country values (1, "USA")'
sqlite3 test.db 'insert into country values (2, "Belgium")'
sqlite3 test.db 'insert into customer values (1, "Joe", 1)'
sqlite3 test.db 'insert into customer values (1, "Peter", 2)'

sqlite3 test.db 'select cust.name, c.name from customer cust, country c where cust.country = c.id order by c.name, cust.name'

Peter|Belgium
Joe|USA

sqlite3 test.db 'select cust.name, c.name from customer cust, country c where cust.country = c.id order by c.name, cust.name' >db1.txt

在bash脚本中执行最后一次查询,在db上运行它并将这两个文件区分开来,无需编程即可为不同的客户提供。

当数据模型更复杂时,这当然会中断。

答案 2 :(得分:0)

我自己开始研究这个问题。一般策略是编写一个创建“身份映射”文件的SQL脚本。该映射包含每个记录的主键值(“人工身份”)和“自然身份”键 - 唯一标识记录的字符串。对于数据库中的某些表,有一个唯一的自然id键(在我的示例中类似于contry名称)。其他表格需要序列中的序号,还有一些表格将其自己的身份与父母身份相结合(如果父母也有父母,则可以递归)。

所有记录都由第二个SQL脚本以标识人工身份的格式转储到第二个文本文件。

perl脚本用地图中的自然身份替换第二个文件中的所有人工身份。

对结果进行排序和区分。