How to feed mysql queries from bash

后端 未结 7 1184
小鲜肉
小鲜肉 2020-12-05 17:52

I\'m trying to make a bash script that creates a mysql user and database but I can\'t find a way to feed the sql into mysql, I\'m trying with this format:

my         


        
相关标签:
7条回答
  • 2020-12-05 17:57

    The reason your attempt did not work was because the < expects a file name and you fed it a string. You would have to do something like

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

    ken's suggestion of

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

    can work, but if you try to use bash variables in your query you can fall foul of parameter expansion. eg

    QUERY="select * from $MYTABLE WHERE name=\"silly@place.com\";"
    mysql --host=localhost --user=user --password=password -e "$QUERY" mydbname
    

    may not do what you expect. One option is use

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

    which works if the query string contains appropriate quoting. Another option is the "here" document as suggested by dogbane.

    0 讨论(0)
  • 2020-12-05 17:59
    cat <<EOD | mysql [-u user] [-ppassword] [database]
      select 1;
      select 2;
      select 3;
    EOD
    

    in your case

    cat <<EOD | mysql -u root -p
        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";
        FLUSH PRIVILEGES;
    EOD
    
    0 讨论(0)
  • 2020-12-05 18:03

    For big queries in a bash script, you can try:

    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
    
    0 讨论(0)
  • 2020-12-05 18:05

    Try using a here document like this:

    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
    

    Alternatively place all you commands in text file and run it:

    mysql --host=localhost --user=user --password=password < commands.sql
    
    0 讨论(0)
  • 2020-12-05 18:14

    Try like this:

    echo "select 1" | mysql
    
    0 讨论(0)
  • 2020-12-05 18:15

    Have you tried mysql -e query?

    0 讨论(0)
提交回复
热议问题