代码之家  ›  专栏  ›  技术社区  ›  David

当代码基没有ORM时对MySQL数据库进行版本控制

  •  3
  • David  · 技术社区  · 16 年前

    我考虑这个问题已经有一段时间了,还没有想出任何稳定/优雅的想法。

    我知道,使用myisam表,您可以获得表def的更新时间,但是对于innodb,这不是真的,而且我发现查看.frm文件了解何时修改定义甚至是不可靠的。不允许更改数据集。

    我有一个想法,每30分钟mysqldumping一个模式的内容,用awk脚本将其分解,然后将其与最后一个版本进行比较…但这似乎有点过分,如果涉及的数据集很大,这可能是一个问题。

    3 回复  |  直到 16 年前
        1
  •  1
  •   Community CDub    8 年前

    这让我想起了这个问题: How do you manage database revisions on a medium sized project with branches? 但也许我要对将军说…

    http://odetocode.com/Blogs/scott/archive/2008/01/30/11702.aspx

    我目前正在研究的代码库没有ORM,但是我们仍然使用基于上面博客的解决方案。它起作用了。

        2
  •  2
  •   Gary Richardson    16 年前

    如果你跑 mysqldump -d 它只转储模式:

    [gary.richardson@server ~]$ mysqldump -d -u root mysql user
    -- MySQL dump 10.11
    --
    -- Host: localhost    Database: mysql
    -- ------------------------------------------------------
    -- Server version       5.0.45
    
    /*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
    /*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
    /*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
    /*!40101 SET NAMES utf8 */;
    /*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
    /*!40103 SET TIME_ZONE='+00:00' */;
    /*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
    /*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
    /*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
    /*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
    
    --
    -- Table structure for table `user`
    --
    
    DROP TABLE IF EXISTS `user`;
    CREATE TABLE `user` (
      `Host` char(60) collate utf8_bin NOT NULL default '',
      `User` char(16) collate utf8_bin NOT NULL default '',
      `Password` char(41) character set latin1 collate latin1_bin NOT NULL default '',
      `Select_priv` enum('N','Y') character set utf8 NOT NULL default 'N',
      `Insert_priv` enum('N','Y') character set utf8 NOT NULL default 'N',
      `Update_priv` enum('N','Y') character set utf8 NOT NULL default 'N',
      `Delete_priv` enum('N','Y') character set utf8 NOT NULL default 'N',
      `Create_priv` enum('N','Y') character set utf8 NOT NULL default 'N',
      `Drop_priv` enum('N','Y') character set utf8 NOT NULL default 'N',
      `Reload_priv` enum('N','Y') character set utf8 NOT NULL default 'N',
      `Shutdown_priv` enum('N','Y') character set utf8 NOT NULL default 'N',
      `Process_priv` enum('N','Y') character set utf8 NOT NULL default 'N',
      `File_priv` enum('N','Y') character set utf8 NOT NULL default 'N',
      `Grant_priv` enum('N','Y') character set utf8 NOT NULL default 'N',
      `References_priv` enum('N','Y') character set utf8 NOT NULL default 'N',
      `Index_priv` enum('N','Y') character set utf8 NOT NULL default 'N',
      `Alter_priv` enum('N','Y') character set utf8 NOT NULL default 'N',
      `Show_db_priv` enum('N','Y') character set utf8 NOT NULL default 'N',
      `Super_priv` enum('N','Y') character set utf8 NOT NULL default 'N',
      `Create_tmp_table_priv` enum('N','Y') character set utf8 NOT NULL default 'N',
      `Lock_tables_priv` enum('N','Y') character set utf8 NOT NULL default 'N',
      `Execute_priv` enum('N','Y') character set utf8 NOT NULL default 'N',
      `Repl_slave_priv` enum('N','Y') character set utf8 NOT NULL default 'N',
      `Repl_client_priv` enum('N','Y') character set utf8 NOT NULL default 'N',
      `Create_view_priv` enum('N','Y') character set utf8 NOT NULL default 'N',
      `Show_view_priv` enum('N','Y') character set utf8 NOT NULL default 'N',
      `Create_routine_priv` enum('N','Y') character set utf8 NOT NULL default 'N',
      `Alter_routine_priv` enum('N','Y') character set utf8 NOT NULL default 'N',
      `Create_user_priv` enum('N','Y') character set utf8 NOT NULL default 'N',
      `ssl_type` enum('','ANY','X509','SPECIFIED') character set utf8 NOT NULL default '',
      `ssl_cipher` blob NOT NULL,
      `x509_issuer` blob NOT NULL,
      `x509_subject` blob NOT NULL,
      `max_questions` int(11) unsigned NOT NULL default '0',
      `max_updates` int(11) unsigned NOT NULL default '0',
      `max_connections` int(11) unsigned NOT NULL default '0',
      `max_user_connections` int(11) unsigned NOT NULL default '0',
      PRIMARY KEY  (`Host`,`User`)
    ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='Users and global privileges';
    /*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;
    
    /*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
    /*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
    /*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
    /*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
    /*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
    /*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
    /*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;
    
    -- Dump completed on 2008-10-02 20:06:38
    

    然后您可以进行解析。

    你的问题还有另一个解决办法,但需要纪律。可以向列和表中添加注释字段:

    CREATE TABLE example (
      name varchar(32) COMMENT='Name of a person'
    ) COMMENT='example table';
    

    我喜欢在里面放一个版本号。你可以把它和你的雷达控制系统联系起来:

    CREATE TABLE example (
      name varchar(32) COMMENT='Name of a person'
    ) COMMENT='VERSION=1.2.3 example table';
    
        3
  •  0
  •   Vasil    16 年前

    是的,这很难。这就是我使用InnoDB的原因。转储/导入更容易,我们甚至把模式放在vc下。