Giải pháp tôi sử dụng (ban đầu được phát triển bởi một người bạn của tôi) là một phụ lục khác cho yukondude.
- Tạo thư mục lược đồ trong điều khiển phiên bản và sau đó cho mỗi thay đổi db, bạn giữ tệp .sql với SQL bạn muốn thực hiện cùng với truy vấn sql để cập nhật bảng db_schema.
- Tạo bảng cơ sở dữ liệu có tên "db_schema" với một cột số nguyên có tên là phiên bản.
- Trong thư mục lược đồ tạo hai kịch bản lệnh shell, "current" và "update".Việc thực thi hiện tại cho bạn biết phiên bản nào của lược đồ db mà cơ sở dữ liệu bạn đang kết nối hiện đang ở. Chạy cập nhật thực thi từng tệp .sql được đánh số lớn hơn phiên bản trong bảng db_schema tuần tự cho đến khi bạn lên đến tệp được đánh số lớn nhất trong thư mục lược đồ của bạn.
tập tin trong thư mục schema:
0-init.sql
1-add-name-to-user.sql
2-add-bio.sql
Thật là một tập tin thông thường có vẻ như, lưu ý cập nhật db_schema ở phần cuối của mỗi tập tin sql:
BEGIN;
-- comment about what this is doing
ALTER TABLE user ADD COLUMN bio text NULL;
UPDATE db_schema SET version = 2;
COMMIT;
Tập lệnh "hiện tại" (cho psql):
#!/bin/sh
VERSION=`psql -q -t <<EOF
\set ON_ERROR_STOP on
SELECT version FROM db_schema;
EOF
`
[ $? -eq 0 ] && {
echo $VERSION
exit 0
}
echo 0
kịch bản cập nhật (cũng psql):
#!/bin/sh
CURRENT=`./current`
LATEST=`ls -vr *.sql |egrep -o "^[0-9]+" |head -n1`
echo current is $CURRENT
echo latest is $LATEST
[[ $CURRENT -gt $LATEST ]] && {
echo That seems to be a problem.
exit 1
}
[[ $CURRENT -eq $LATEST ]] && exit 0
#SCRIPT_SET="-q"
SCRIPT_SET=""
for ((I = $CURRENT + 1 ; I <= $LATEST ; I++)); do
SCRIPT=`ls $I-*.sql |head -n1`
echo "Adding '$SCRIPT'"
SCRIPT_SET="$SCRIPT_SET $SCRIPT"
done
echo "Applying updates..."
echo $SCRIPT_SET
for S in $SCRIPT_SET ; do
psql -v ON_ERROR_STOP=TRUE -f $S || {
echo FAIL
exit 1
}
done
echo OK
My 0-init.sql có cấu trúc sơ đồ ban đầu đầy đủ cùng với ban đầu "UPDATE db_schema SET version = 0;". Không nên quá khó để sửa đổi các tập lệnh này cho MySQL. Trong trường hợp của tôi, tôi cũng có
export PGDATABASE="dbname"
export PGUSER="mike"
trong .bashrc của tôi. Và nó sẽ nhắc mật khẩu với mỗi tập tin đang được thực thi.
Nguồn
2010-08-15 18:24:27
Làm cách nào để xử lý việc đổi tên cột? Việc đổi tên nhanh sẽ phá vỡ môi trường sản xuất của bạn, phải không? –
@Kevin Pang - đó là sự thật nhưng tôi không đổi tên cột của tôi quá thường xuyên. Tôi đã tìm thấy con quỷ nhỏ hơn là để lại tên cột theo cách của chúng. Nó làm cho tôi suy nghĩ cẩn thận về tên cột nhưng tôi cũng thấy đó là một sự xuất hiện hiếm hoi. Nếu việc đổi tên phải xảy ra, việc tìm kiếm thay thế trong hai hệ thống không mất nhiều thời gian hơn một hệ thống. Nó vẫn gây ra ít thời gian chết và tình tiết tăng nặng hơn so với di chuyển DB. Tôi biết nó độc đáo, nhưng nó hoạt động rất tốt cho tôi :) – Paulo