18

Stackoverflow 和 MySQL-via-command-line n00b 这里,请轻点!我一直在寻找我的问题的答案,但只能通过 GitHub 找到处理 GitHubbing MySQL 转储(如:数据转储)以进行协作或 MySQL“版本控制”的主题,这两者都没有告诉我我想知道的内容:

GitHub 上的 PHP 项目如何包含 MySQL 数据库模式/表信息?

我想在 GitHub 上共享一个 PHP 项目,该项目依赖于具有某些表的 MySQL 数据库的存在。如果有人想复制/使用这个项目,他们需要有这些特定的表来使脚本工作(除了一个表之外的所有表在开始时都是空的,只有随着时间的推移由用户通过脚本填充; 非空表从一开始就包含三个值)。一个人如何做到这一点,什么是常见的做法

  • 我是否只需获取我自己的 db/tables 的(完整)转储文件,然后删除所有数据部分(除了那个非空表),将所有自动增量设置为零,然后将该 .sql 文件连同一起上传到 GitHub项目的其余部分? 或者
  • 最好/更好的做法是编写一个(PHP)脚本,(可能不是那么有经验的)用户可以使用它来创建这些表,而不必使用 mysqldump/命令行魔法?

如果解决方案 #1 是可行的方法,我是否会包含有关如何使用此类 .sql 文件的进一步说明?

抱歉,如果我的问题听起来很愚蠢,但正如我上面所说,我自己是使用命令行处理 MySQL 相关内容的新手,并且直到昨天才使用 phpMyAdmin(当我使用 mysqldump 创建我的第一个转储文件时 - 耶!) .

4

2 回答 2

8

常见的做法是包含一个创建必要表的安装脚本,因此解决方案 #2 将是可行的方法。

[编辑] 该脚本可以只重播转储。;)

您可能还对迁移感兴趣:How to automatically migration (schema and data) for PHP/MySQL application

于 2013-04-29T21:35:39.133 回答
1

如果您还想跟踪数据库架构更改

你可以使用 git 钩子。
在目录中[your_project_dir]/.git/hooks添加/编辑脚本pre-commit

#!/bin/sh -e
set -o errexit

# -- you can omit next line if not using version table
version=`git log --tags --no-walk --pretty="format:%d" | sed 1q | sed 's/[()]//g' | sed s/,[^,]*$// | sed  's ......  '`

BASEDIR=$(dirname "$0")

# -- set directorey wher schema dump is placed
dumpfile=`realpath "$BASEDIR/../../install/database.sql"`

echo "Dumping database to file: $dumpfile"

# -- dump database schema
mysqldump -u[user] -p[password] --port=[port] [database-name] --protocol=TCP --no-data=true --skip-opt --skip-comments  --routines | \
sed -e 's/DEFINER[ ]*=[ ]*[^*]*\*/\*/' > "$dumpfile"

# -- dump versions table and update core vorsiom according to last git tag
mysqldump -u[user] -p[password] --port=[port] [database-name] [versions-table-name] --protocol=TCP --no-    data=false --skip-opt --skip-comments  --no-create-info  | \
sed -e 's/DEFINER[ ]*=[ ]*[^*]*\*/\*/' | \
sed -e "/INSERT INTO \`versions\` VALUES ('core'/c\\INSERT INTO \`versions\` VALUES ('core','$version');" >> "$dumpfile"

git add "$dumpfile"

# --- Finished
exit 0    

改变[user], [password], [port], [database-name], [versions-table-name]

该脚本在每次提交时由 git 自动执行。如果提交标签新版本按标签名称保存到表转储中。如果数据库中没有更改,则不提交任何内容。确保脚本是否可执行 :) 您的安装脚本可以从此转储中获取 sql 查询,开发人员可以轻松跟踪数据库更改。

于 2018-12-29T00:25:52.453 回答