onlinebuddies / modyllic
MySQL数据库迁移、模式比较、存储过程管理变得简单
Requires
This package is not auto-updated.
Last update: 2024-09-16 02:31:36 UTC
README
Modyllic是一个SQL解析器和一组模式管理工具,用PHP 5.2编写,对任何使用SQL的人来说都很有用。
Modyllic的核心是一个用于管理分支间模式更改的工具。因为它允许您将模式存储为DDL,这意味着可以使用标准工具轻松处理分支之间的合并。除了分析(转储和比较)工具外,它还提供了迁移工具(迁移、应用)。它还提供了简化PHP中存储过程操作的工具——它包含一个用于调用存储过程并包含类型检查和完全展开的返回值的PHP包装器工具,例如,您可以返回一个表并获取包含所有行的数组,而无需单独的检索步骤。
三个主要用例包括
-
检测和检查数据库之间的差异。
-
用更灵活的变更管理替换传统的线性上下文脚本。
-
提供对存储例程的一致、安全和透明访问。
Modyllic操作“模式”,它可以表示数据库、表和列定义、例程、事件、触发器以及数据。它们存储在文件中,作为通常用于创建表的SQL语句。可以在命令行上指定模式为
- 连接到实时数据库的DSN
- 文件名
- 目录
- 以上多个项的逗号分隔列表(在这种情况下,将合并所有来源)
组合多个来源的灵活性使得单独处理现状模式与仅打算进行的更改变得容易。
如果需要,DSN应包括用户名和密码。为了方便,您可以使用“:”而不是“;”,因为shell通常会在没有仔细引用的情况下拒绝“;”。因此,您可以编写以下任意一项
mysql:host=database-server.example.org;dbname=MyDB;username=bobby;password=someThingClever
mysql:host=database-server.example.org:dbname=MyDB:username=bobby:password=someThingClever
可用的工具
所有工具都接受--help以获取使用信息。
modyllic migrate -f DSN -t SCHEMA
使DSN中的实时数据库看起来像由SCHEMA描述的数据库。您可以将其视为运行modyllic diff -d MySQL DSN SCHEMA并将差异应用于实时数据库。
modyllic diff SCHEMA1 SCHEMA2
生成将SCHEMA1变成SCHEMA2的ALTER语句等。这比在两个SQL转储上运行“diff”更智能,因为它实际上解析了SQL,忽略了应该忽略的一些内容,并且对语义上下文敏感。这本质上显示了给定的相同参数“迁移”会做什么。
DELIMITER ;; ALTER TABLE person ADD COLUMN dob DATE AFTER name, -- BEFORE name VARCHAR(50) NOT NULL, MODIFY COLUMN name VARCHAR(200) NOT NULL ;; DROP PROCEDURE new_person ;; -- Arguments count differ -- diff -u /tmp/sqlg_14782_from.txt /tmp/sqlg_14782_to.txt -- BODY DIFFERS (9): -- --- /tmp/sqlg_14782_from.txt 2013-12-02 10:35:06.549095299 -0500 -- +++ /tmp/sqlg_14782_to.txt 2013-12-02 10:35:06.549095299 -0500 -- @@ -1,4 +1,4 @@ -- BEGIN -- - INSERT INTO person SET name=p_name; -- + INSERT INTO person SET name=p_name, dob=p_dob; -- SELECT LAST_INSERT_ID() as personId; -- END -- \ No newline at end of file CREATE PROCEDURE new_person( p_name VARCHAR(200), p_dob DATE) RETURNS COLUMN personId BEGIN INSERT INTO person SET name=p_name, dob=p_dob; SELECT LAST_INSERT_ID() as personId; END ;; DELIMITER ;
modyllic drop SCHEMA
生成DROP、DELETE等命令以删除SCHEMA(但实际上不修改任何内容)。它相当于modyllic diff SCHEMA /dev/null。
DELIMITER ;; DROP PROCEDURE new_person ;; DROP TABLE person ;; DELIMITER ;
以及MySQL输出方言
SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0; SET NAMES 'utf8'; DELIMITER ;; DROP PROCEDURE IF EXISTS new_person ;; DROP TABLE IF EXISTS MODYLLIC ;; DROP TABLE IF EXISTS person ;; DELIMITER ; SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS;
modyllic dump SCHEMA
生成从头开始创建SCHEMA的CREATE、INSERT等命令。这是Modyllic对mysqldump -d的替代,它提供了从非常简洁到自己的元数据丰富格式的几个SQL方言的输出选择。您也可以将其视为相当于modyllic diff /dev/null SCHEMA。
DELIMITER ;; CREATE TABLE person ( personId SERIAL PRIMARY KEY, name VARCHAR(50) NOT NULL ) ENGINE=InnoDB ;; CREATE PROCEDURE new_person( p_name VARCHAR(200)) RETURNS COLUMN personId BEGIN INSERT INTO person SET name=p_name; SELECT LAST_INSERT_ID() as personId; END ;; DELIMITER ;
以及MySQL输出方言
SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0; SET NAMES 'utf8'; DELIMITER ;; CREATE TABLE person ( personId BIGINT UNSIGNED NOT NULL auto_increment PRIMARY KEY, name VARCHAR(50) NOT NULL ) ENGINE=InnoDB ;; -- This is used to store metadata used by the schema management tool CREATE TABLE MODYLLIC ( kind CHAR(9) NOT NULL, which CHAR(90) NOT NULL, value VARCHAR(20000) NOT NULL, PRIMARY KEY (kind,which) ) ENGINE=InnoDB ;; TRUNCATE TABLE MODYLLIC ;; INSERT INTO MODYLLIC SET kind='COLUMN', which='person.personId', value='{"type":"SERIAL","unique":true}' ;; INSERT INTO MODYLLIC SET kind='INDEX', which='person.!PRIMARY KEY', value='{"column_defined":true}' ;; INSERT INTO MODYLLIC SET kind='TABLE', which='MODYLLIC', value='{"static":true}' ;; INSERT INTO MODYLLIC SET kind='ROUTINE', which='new_person', value='{"returns":{"type":"COLUMN","column":"personId"}}' ;; CREATE PROCEDURE new_person( p_name VARCHAR(200)) BEGIN INSERT INTO person SET name=p_name; SELECT LAST_INSERT_ID() as personId; END ;; DELIMITER ; SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS;
modyllic procstophp SCHEMA
为模式中的存储过程生成PHP辅助类。
<?php class Database { /** * @param $dbh * @param VARCHAR(200) $p_name * @returns personId */ public static function new_person($dbh, $p_name) { assert('is_null($p_name) or is_scalar($p_name)'); assert('is_null($p_name) or mb_strlen($p_name) <= 200'); $sth = $dbh->prepare('CALL new_person(:p_name)'); $sth->bindValue(':p_name', isset($p_name)? (string)$p_name: null, PDO::PARAM_STR); $sth->execute(); try { $row = $sth->fetch(PDO::FETCH_ASSOC); $sth->closeCursor(); if ( $row === false ) { return ; } assert('isset($row[\'personId\'])'); return $row['personId']; } catch (PDOException $e) { if (strpos($e->getMessage(), 'SQLSTATE[HY000]: General error') !== false) { throw new PDOException('General error while fetching return value of new_person; this usually means that you declared this routine as having a return value but it does not actually select any data before completing.'); } else { throw $e; } } } }
cat FILENAME.sql | modyllic colorize
对调试很有用,只需将一些SQL传递给它即可,它将在STDOUT上输出彩色、语法高亮的版本。
modyllic preparse FILENAME.sql > FILENAME.sqlc - 可以用于通过“预编译”输入来优化其他工具的性能。如果存在更新的.sqlc文件,其他工具将优先加载.sqlc文件而不是.sql文件。
