1

我正在编写一个测试框架,我需要在其中捕获 MySQL 数据库状态(表结构、内容等)。

我需要这个来检查在某些操作后状态没有改变。(可能允许更改自动增量值,但我想我能够处理这个问题。)

转储最好采用人类可读的格式(最好是 SQL 代码,如 mysqldump 那样)。

我希望将我的测试框架限制为仅使用 MySQL 连接。要捕获状态,它不应调用mysqldump 或访问文件系统(如复制 *.frm 文件或执行 SELECT INTO 文件,但管道很好)。

由于这将是仅测试代码,因此我不关心性能。不过,我确实需要可靠的行为。

实现我需要的功能的最佳方式是什么?

我想我应该将我的代码基于一些现有的开源备份工具......哪个是最好看的?

更新:我没有指定我写这个的语言(不,那不是 PHP),因为我认为我不能按原样重用代码 - 我的情况相当特殊(出于实际目的,假设 MySQL C API)。代码将在 Linux 上运行。

4

3 回答 3

2

鉴于您的要求,我认为您只剩下(伪代码+ SQL)

tables = mysql_fetch "SHOW TABLES"
foreach table in tables
    create = mysql_fetch "SHOW CREATE TABLE table"
    print create
    rows = mysql_fetch "SELECT * FROM table"
    foreach row in rows
        // or could use VALUES (v1, v2, ...), (v1, v2, ...), .... syntax (maybe preferable for smaller tables)
        insert = "INSERT (fiedl1, field2, field2, etc) VALUES (value1, value2, value3, etc)"
        print insert

基本上,获取所有表的列表,然后遍历每个表并INSERT手动为每一行生成语句(大多数 api 有一个简单的方法来获取列名列表,否则你可以回退到调用DESC TABLE)。

SHOW CREATE TABLE已为您完成,但我相当肯定没有类似的事情要做SHOW INSERT ROWS

当然,您可以用它做任何您想做的事情,而不是打印转储。

于 2010-01-09T06:54:53.347 回答
1

如果您不想使用命令行工具,换句话说,您想完全在 php 或您使用的任何语言中完成它,那么为什么不使用 SQL 本身迭代表。例如,要检查表结构,一种简单的技术是使用 SHOW CREATE TABLE table_name 捕获表结构的快照,存储结果,然后再次调用并比较结果。

你看过 mysqldump 的源代码吗?我相信您想要的大部分内容都会包含在其中。

直流

于 2010-01-08T00:41:33.400 回答
0

除非您自己构建导出,否则我认为没有简单的解决方案来导出和验证数据。如果您按表执行,则LOAD DATA INFILESELECT ... INTO OUTFILE可能会有所帮助。

我发现为每次测试重建数据库更容易。至少,我可以知道数据的确切状态。当然,运行这些测试需要更多时间,但这是一个很好的激励,可以抽象出操作并编写更少的依赖于数据库的测试。

我在一些设计不允许如此好的划分的项目中使用的另一种选择,使用 InnoDB 或其他一些事务数据库引擎效果很好。只要您跟踪您的事务,或在测试期间禁用它们,您就可以简单地在 setUp() 中启动事务并在 tearDown() 中回滚。

于 2010-01-08T00:43:27.613 回答