2013-11-22 26 views
5

Tôi có một tập lệnh cập nhật MySQL mà tôi muốn chạy từ dòng lệnh, nhưng tôi muốn có thể chuyển biến miền giai đoạn sang tập lệnh.Chuyển các biến MySQL sang tập lệnh từ dòng lệnh

Tôi biết điều này sẽ không làm việc, nhưng đó là cách tốt nhất mà tôi có thể mô tả những gì tôi đang cố gắng để làm:

$ -uroot -hlocalhost mydatabase --execute "SET @domain = 'mydomain.dev' " < ./sql/update_domain.sql 

Bên trong kịch bản, tôi đang sử dụng biến @domain, để cập nhật một số biến cấu hình trong bảng cấu hình, sử dụng các lệnh như sau:

UPDATE my_cfg SET value = @domain WHERE name = 'DOMAIN'; 

Về cơ bản tôi muốn đặt tiền tố SET @domain trên tệp update_domain.sql.

Bất kỳ ý tưởng nào về cách tôi có thể khắc phục cách tiếp cận của mình?

Trả lời

8

Trong Batch File của bạn:

mysql -e "set @domain=PARAMVALUE;source ./sql/update_domain.sql" 

Và trong bạn SQL file:

UPDATE my_cfg SET value = @domain WHERE name = 'DOMAIN'; 
+0

tôi nhận được một lỗi cú pháp, trừ khi tôi đặt một dấu chấm phẩy sau lệnh nguồn – Jeff

+0

Có vẻ như thế này có thể không hoạt động trong mysql 5.6? 'nguồn' hoạt động tương tác, nhưng dường như không hoạt động khi được truyền vào tham số' -e'. – ebyrob

2

này làm việc cho tôi:

system("(echo \"SET @domain = 'newstore.personera.abc';\"; cat sql/set_domain.sql) > /tmp/_tmp.sql") 
system("mysql -uroot -hlocalhost newstore.personera.dev < /tmp/_tmp.sql") 
system("rm /tmp/_tmp.sql") 

... gọi với hệ thống() từ Capistrano.

3

bạn có thể làm điều đó với sed như thế này:

echo "UPDATE my_cfg SET value = '#domain#' WHERE name = 'DOMAIN'" | sed 's/#domain#/mydomain.dev/' | mysql -uusername -ppassword dbname 

hoặc update.sql có UPDATE:

cat update.sql | sed 's/#domain#/mydomain.dev/' | mysql -uusername -ppassword dbname 
+0

Và tất nhiên, trong trường hợp kịch bản sh, hãy sử dụng dấu nháy kép trong phần sed để chuyển giá trị mới dưới dạng biến. tức là 'cat update.sql | sed "s/# tên miền #/$ some_var /" | mysql -uusername -ppassword dbname' –

Các vấn đề liên quan