2011-05-27 22 views
25

Tôi đang cố gắng tạo một tập lệnh bash tạo người dùng và cơ sở dữ liệu mysql nhưng tôi không thể tìm cách nạp sql vào mysql, tôi đang thử định dạng này:Làm thế nào để nạp các truy vấn mysql từ bash

mysql < echo "query" 

Nhưng điều đó không làm việc, xem ví dụ dưới đây:

mysql --host=localhost --user=user --password=password < echo "CREATE USER 'testuser'@'localhost' IDENTIFIED BY 'jakdJxct8W'; 
CREATE DATABASE IF NOT EXISTS 'testuser_dev' DEFAULT CHARACTER SET utf8 COLLATE utf8_bin; 
GRANT ALL PRIVILEGES ON 'testuser_dev' . * TO 'testuser'@'localhost'; 
CREATE DATABASE IF NOT EXISTS 'testuser_qa' DEFAULT CHARACTER SET utf8 COLLATE utf8_bin; 
GRANT ALL PRIVILEGES ON 'testuser_qa' . * TO 'testuser'@'localhost';" 

Làm thế nào để nuôi mysql với các truy vấn?

+0

không liên quan đến câu hỏi, nhưng bạn cũng có thể tiết kiệm rất nhiều đánh máy bằng cách thiết lập máy chủ, người dùng và mật khẩu của bạn trong một .my .cnf file – Ken

+0

thanks for the tip – Tirithen

Trả lời

31

Hãy thử như sau:

echo "select 1" | mysql 
5

Bạn đã thử mysql -e query chưa?

19

Hãy thử sử dụng một here document như thế này:

mysql --host=localhost --user=user --password=password << END 

CREATE USER 'testuser'@'localhost' IDENTIFIED BY 'jakdJxct8W'; 
CREATE DATABASE IF NOT EXISTS 'testuser_dev' DEFAULT CHARACTER SET utf8 COLLATE utf8_bin; 
GRANT ALL PRIVILEGES ON 'testuser_dev' . * TO 'testuser'@'localhost'; 
CREATE DATABASE IF NOT EXISTS 'testuser_qa' DEFAULT CHARACTER SET utf8 COLLATE utf8_bin; 
GRANT ALL PRIVILEGES ON 'testuser_qa' . * TO 'testuser'@'localhost'; 

END 

Ngoài ra đặt tất cả các bạn các lệnh trong tập tin văn bản và chạy nó:

mysql --host=localhost --user=user --password=password < commands.sql 
+2

+1 Tôi cũng muốn đề cập rằng nếu truy vấn sử dụng backticks, bạn cần phải trích dẫn nhãn mở: 'mysql << 'END'' – adlawson

+0

cảm ơn, rất hữu ích! – KGCybeX

21
mysql --batch --silent -e 'SHOW TABLES'; 

hàng loạt và im lặng là thuận tiện nếu bạn đang có kế hoạch ống đầu ra

+0

Mỗi tài liệu mysql --batch ngụ ý im lặng. – cerd

+0

@cerd --batch without --silent hiển thị tiêu đề cột – Ken

8

Lý do nỗ lực của bạn không hiệu quả là vì < hy vọng tên tệp và bạn đã cho nó một chuỗi. Bạn sẽ phải làm một cái gì đó giống như

echo "YOURQUERYSTRINGHERE">tmpfile 
mysql --host=localhost --user=user --password=password dbname <tmpfile 

đề nghị của

mysql --host=localhost --user=user --password=password -e "QUERY" dbname 

có thể làm việc ken, nhưng nếu bạn cố gắng sử dụng các biến bash trong truy vấn của bạn, bạn có thể rơi hôi của việc mở rộng tham số. ví dụ:

QUERY="select * from $MYTABLE WHERE name=\"[email protected]\";" 
mysql --host=localhost --user=user --password=password -e "$QUERY" mydbname 

không thể làm những gì bạn mong đợi. Một tùy chọn là sử dụng

echo "$QUERY"|mysql --host=localhost --user=user --password=password mydbname 

hoạt động nếu chuỗi truy vấn chứa trích dẫn thích hợp. Một tùy chọn khác là tài liệu "ở đây" theo đề xuất của dogbane.

+0

Giải thích tốt về lỗi của OP. Cảm ơn bạn đã thu thập câu trả lời của người khác và giải thích sự cẩn thận! –

0

Đối với các truy vấn lớn trong một kịch bản bash, bạn có thể thử:

read -d '' SQL_QUERY_1 << EOF 

SELECT prod.id as id, prod.title as title, comp.name as company, pho.id as photo_id, pho.image as photo_name 
FROM products as prod 
JOIN accounts as comp 
ON comp.id = prod.account_id 
JOIN photos as pho 
ON pho.id = prod.featured_photo_id; 

EOF 

echo ${SQL_QUERY_1} | mysql 
Các vấn đề liên quan