我正在编写一个测试框架,我需要捕获MySQL数据库状态(表结构,内容等)。
我需要这个来实现检查,在某些操作之后状态没有改变。 (允许自动增量值 可以改变,但我想我能够处理这个。)
转储最好应采用人类可读的格式(最好是SQL代码,如mysqldump)。
我希望将我的测试框架限制为仅使用MySQL连接。要捕获状态,它应该不调用mysqldump或访问文件系统(如复制* .frm文件或SELECT IN IN文件,管道也可以。)
由于这是仅测试代码,我并不关心性能。我确实需要可靠的行为。
实现我需要的功能的最佳方法是什么?
我想我应该将我的代码基于一些现有的开源备份工具......哪个是最好看的?
更新:我没有指定我写的语言(不,那不是PHP),因为我认为我不能按原样重用代码 - 我的情况是相当特殊(出于实际目的,我们假设MySQL C API)。代码将在Linux上运行。
答案 0 :(得分: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
的内容。
当然,不是打印转储,而是可以随心所欲地做任何事情。
答案 1 :(得分:1)
如果您不想使用命令行工具,换句话说,您希望在php或您使用的任何语言中完全执行此操作,那么为什么不使用SQL本身迭代表。例如,要检查表结构,一种简单的技术是使用SHOW CREATE TABLE table_name捕获表结构的snapsot,存储结果,然后再次进行调用并比较结果。
你看过mysqldump的源代码吗?我相信你想要的大部分都将包含在其中。
DC
答案 2 :(得分:0)
除非您自己构建导出,否则我认为没有简单的解决方案来导出和验证数据。如果您按表格执行,LOAD DATA INFILE和SELECT ... INTO OUTFILE可能会有所帮助。
我发现每次测试都可以更轻松地重建数据库。至少,我可以知道数据的确切状态。当然,运行这些测试需要更多的时间,但是抽象操作并减少依赖于数据库的测试是一个很好的动机。
我在一些项目中使用的其他替代方案,其中设计不允许这样的良好划分,使用InnoDB或其他一些事务数据库引擎效果很好。只要您跟踪事务或在测试期间禁用它们,您只需在setUp()中启动事务并在tearDown()中回滚。