使用 sqitch 中的 mysql 查询验证表不存在

Posted

技术标签:

【中文标题】使用 sqitch 中的 mysql 查询验证表不存在【英文标题】:Verify table does NOT exist with mysql query in sqitch 【发布时间】:2019-02-01 18:57:10 【问题描述】:

我正在使用 sqitch 来跟踪数据库更改,它的工作方式之一是使用 sql 查询来验证更改。如果查询返回错误,则认为更改不成功。

我有一个更改,我从我的 mysql 数据库中永久删除一个表。要验证部署,如果表存在,我的验证需要返回错误。虽然如果表不存在则返回错误很简单,但如何让 mysql 仅在特定表存在时才返回错误?

【问题讨论】:

你可以尝试创建一个同名的表或视图,如果表存在,就会报错。有趣的是,如果您创建一个同名的临时表,它不会抛出错误。 但我会选择检查INFORMATION_SCHEMA.TABLES 中的表而不是导致错误。 尝试创建同名表似乎是一个聪明的解决方案。我担心使用 information_schema.tables 因为我可能不知道在我的脚本上下文中当前数据库是什么或用户可以访问哪些数据库,因为脚本的目标数据库要么在配置中,要么在命令行。 DATABASE()函数返回当前会话的默认数据库。 查看 information_schema 感觉更优雅,但即使在那里,如果找到结果,我也不知道如何抛出错误。也就是说,我已经使用 CREATE + DROP(清理)实现了我的验证,它似乎按要求工作。 【参考方案1】:

使用Sqitch自带的checkit函数,如described in the MySQL tutorial:

SELECT checkit(COUNT(*) = 0, 'Table "foo" exists but should not')
  FROM information_schema.tables
 WHERE table_schema = 'your_db'
   AND table_name = 'dropped_table';

【讨论】:

不知何故没有意识到 checkit() 也适用于这种类型的查询,但这是有道理的。从源头获取信息总是好的。谢谢。 为什么sqitch数据库有checkit()函数?我没有,我猜是因为我自己创建了 sqitch 数据库并使用 DB 转储加载它。 我添加了checkit() 专门用于解决直接验证检查的需求。您可以将其定义视为注册表架构(数据库)here 的一部分。

以上是关于使用 sqitch 中的 mysql 查询验证表不存在的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 sqitch postgresql 验证更改列数据类型更改?

如果第二个表不存在连接,Mysql 使用一个表中的列值

无法使用 Sqitch 连接到 Snowflake

如果表不存在执行长查询

如何使用 sqitch 部署雪花数据库?

BIGQUERY:连接谓词中的表不受支持的子查询