我怎样才能测试一个SQL;“创建表格”;语句是否等效于现有表?
对于MySQL数据库中的每个表,我都有一个我怎样才能测试一个SQL;“创建表格”;语句是否等效于现有表?,sql,mysql,unit-testing,Sql,Mysql,Unit Testing,对于MySQL数据库中的每个表,我都有一个mytablename.sql文件,其中包含该表的createtable语句 我想添加一个测试,以检查noone是否在不更新此文件的情况下在live数据库中添加/更改了列—我想检查我是否可以使用这些脚本重新创建空数据库 我怎样才能可靠地做到这一点 一个选项是使用mytable中的显示列(或描述mytable),在命令行上以如下表格形式输出: +---------+------------------+------+-----+--------------
mytablename.sql
文件,其中包含该表的createtable
语句
我想添加一个测试,以检查noone是否在不更新此文件的情况下在live数据库中添加/更改了列—我想检查我是否可以使用这些脚本重新创建空数据库
我怎样才能可靠地做到这一点
一个选项是使用mytable中的显示列(或描述mytable
),在命令行上以如下表格形式输出:
+---------+------------------+------+-----+---------------------+----------------+
| Field | Type | Null | Key | Default | Extra |
+---------+------------------+------+-----+---------------------+----------------+
| pk_guid | int(10) unsigned | NO | PRI | NULL | auto_increment |
| d_start | datetime | NO | MUL | 0000-00-00 00:00:00 | |
| d_end | datetime | NO | MUL | 0000-00-00 00:00:00 | |
+---------+------------------+------+-----+---------------------+----------------+
然后创建一个临时表并比较结果
这很好,只是如果有任何列被添加到live数据库中,那么结果的行顺序可能不同
不幸的是,似乎不可能将orderby
与SHOW COLUMNS
一起使用
另一个选项是使用showcreatetable
,但其中包括诸如AUTO_INCREMENT
计数器值之类的信息,我不关心这些信息
有更好的方法吗?您写道:
一个选项是使用显示列
。。。在命令行上。。。。
[但列]的行顺序可能不同
你可以在事后强制执行这个命令。在UNIX ish系统上,您可以简单地:
$ mysql -Bse 'SHOW COLUMNS FROM possibly_altered' | sort
并将其与您的.sql
文件生成的临时表上类似的经过整理和排序的SHOW
输出进行比较。(Bs
-Bs抑制了一些mysql(1)奇特的格式和标题,对于更具编程性的比较来说,这是不必要的,也有点不方便。)过去我在数据库服务器(开发/生产设置)中使用了一个比较贫民区/管道磁带PHP shell脚本。假设您有两台服务器,其中一台是“正确的”:
- 获取每个表的列列表以进行检查<如果您对可能更改的数据类型/默认值不感兴趣,可以使用代码>显示创建表工作,或者选择x限制1中的*
- array_sort()按字母顺序排列字段名称,并循环遍历每个字段,比较您感兴趣的任何潜在更改
一种更优雅、更简洁的方法(仅限于MySQL5+)是使用
information\u schema
系统数据库,尤其是COLUMNS
表。如果您没有两台服务器,那么保存/复制列信息的单独数据库(例如,具有最新“正确”模式的信息模式的克隆)也可以工作。这将使您能够区分新的/删除的表、索引、触发器、过程、用户/权限等。我认为SHOW CREATE TABLE是您所能获得的最佳选择。谁在乎是否有额外的信息,你可以很容易地切断它。