【问题标题】:MySQL check if table has correct schemaMySQL 检查表是否具有正确的架构
【发布时间】:2016-06-18 00:55:10
【问题描述】:

我目前正在开发带有 MySQL 数据后端的 C++ 服务器软件。我正在使用official MySQL/connector library from Oracle 来处理 MySQL。连接本身正在工作,我对此没有任何问题。
我的问题是数据库和表模式往往会不时更改,因为新表和列会不断添加。出于同样的原因,也可能会更改退出列。为了确保我能快速识别过时的服务器软件,我想在数据库更改时添加警告。
我的第一个想法是硬编码数据库(和表等)的外观,然后检查当前数据库是否与硬编码数据匹配。但我不知道如何做到这一点。

总而言之我希望能够检测到是否

  • 已添加或删除表
  • 表中的列已更改
  • 已添加或删除表中的列

尽可能少的 C++ 代码。它也应该很容易维护。

需要时会添加其他信息。

【问题讨论】:

  • "需要时会添加其他信息。" - 这不是一个好问题的提出方式!
  • 添加一些元信息以启用架构版本控制。
  • @πάνταῥεῖ 我该怎么做?
  • @MitchWheat 老实说,我不知道我没有提供哪些信息可能有助于回答这个问题。我打算用这句话来传达这一点,并且我愿意添加我认为与该问题无关的信息。我不认为你对这个短语有任何问题。

标签: c++ mysql database-schema


【解决方案1】:

我会建议以下方法:

1) fork 并执行mysql 命令行客户端。设置一对管道,到mysql的标准输入输出。

2) 此时您应该可以通过标准输入管道将简单的命令传送到mysql,并从标准输出管道读取输出。

你需要仔细记录每条mysql命令的输出格式,这样你就知道什么时候读完它的输出,然后你就可以发送下一条命令了。

3) 作为存在的第一顺序,执行:

show tables;

返回的输出将列出数据库中的所有表。将输出解析为表名列表很简单。然后对每个表执行:

show create table <tablename>;

生成的输出显示表中的所有字段、其键和约束。几乎所有这个表的模式。为每张桌子起泡、冲洗、重复。

4) 通过这种方式,您可以捕获整个数据库的基本模式,以进行比较。如有必要,使用相同的方法来捕获触发器和其他对象。您可能需要对数据进行一些小的按摩,并排除一些位。例如,“show create table”将包含当前的AUTO_INCREMENT 值,您可以忽略它。

当然,这种通过标准输入和输出驱动 mysql 进程的通用方法有点不稳定。稍加工作,您就可以使用 mysql 的本地客户端库,并直接执行所有这些命令,并捕获它们的结果。这应该更可靠。

【讨论】:

  • MySQL/Connector (dev.mysql.com/doc/connector-cpp/en) 允许我在不使用mysql 客户端的情况下进行查询。但我一定会尝试一下。
  • 经过一番折腾,我不得不说您的建议非常有效!另外,我要感谢您提出 C++ 解决方案。
猜你喜欢
  • 2011-01-02
  • 1970-01-01
  • 2017-02-20
  • 1970-01-01
  • 1970-01-01
  • 2018-04-21
  • 2016-05-17
  • 2022-01-15
  • 2013-09-14
相关资源
最近更新 更多