直接在mysql这个层面(例如命令行或者phpmyadmin等)管理存储过程是一个非常麻烦的事情:
第一步:把存储过程文件都放到git下管理
例如放在项目的sql目录下:
1 2 3 4 5 6
| $ ls sql/ proc_money_appeal_payout.sql proc_money_apply_cash_payout.sql proc_money_apply_cash_income_close.sql proc_money_reward_income.sql proc_money_apply_cash_income_fail.sql proc_money_reward_payout.sql proc_money_apply_cash_income_finish.sql proc_money_security_deposit_income.sql proc_money_apply_cash_income.sql proc_money_security_deposit_payout.sql
|
第二步:生成导入数据库的sql文件
如果项目的存储过程比较多,每次更新时都可能会变得很麻烦,所以需要统一的导入入口,例如sql目录下生成source.sql文件,内容如下:
1 2 3 4 5 6 7 8 9 10
| // vim sql/source.sql source /home/code/ibbd/yanjiuquan-php/sql/proc_money_appeal_payout.sql; source /home/code/ibbd/yanjiuquan-php/sql/proc_money_apply_cash_income.sql; source /home/code/ibbd/yanjiuquan-php/sql/proc_money_apply_cash_income_close.sql; source /home/code/ibbd/yanjiuquan-php/sql/proc_money_apply_cash_income_fail.sql; source /home/code/ibbd/yanjiuquan-php/sql/proc_money_apply_cash_income_finish.sql; source /home/code/ibbd/yanjiuquan-php/sql/proc_money_apply_cash_payout.sql; source /home/code/ibbd/yanjiuquan-php/sql/proc_money_apply_cash_payout_close.sql; source /home/code/ibbd/yanjiuquan-php/sql/proc_money_apply_cash_payout_finish.sql; source /home/code/ibbd/yanjiuquan-php/sql/proc_money_reward_income.sql;
|
说明:这个source文件不应该加入git版本控制中。
这样只需要在命令行中,source这个文件即可:
1
| source /path/to/source.sql
|
第三步:自动生成source.sql
如果手动管理这个文件,也是挺麻烦的,可以结合laravel自动生成:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| use Illuminate\Database\Seeder; class ProcdureInitTableSeeder extends Seeder { public function run() { $path = 'sql/proc_*.sql'; $root = getcwd(); $files = glob($path); $source_file = $root . '/sql/source.sql'; file_put_contents($source_file, "# @desc 导入及更新存储过程结构, 生成命令:php artisan db:seed\n"); file_put_contents($source_file, "# @author Alex\n", FILE_APPEND); file_put_contents($source_file, "# @date " . date('Y-m-d') . "\n\n", FILE_APPEND); foreach ($files as $file) { $sql = "source {$root}/{$file};\n"; file_put_contents($source_file, $sql, FILE_APPEND); } } }
|
The last
每次变化的时候,还是需要手动source一下,略麻烦。。。暂时没有更好的方式。。。