【问题标题】:How to feed mysql queries from bash如何从 bash 提供 mysql 查询
【发布时间】:2011-09-03 06:54:10
【问题描述】:

我正在尝试制作一个 bash 脚本来创建一个 mysql 用户和数据库,但我找不到将 sql 输入 mysql 的方法,我正在尝试使用这种格式:

mysql < echo "query"

但这不起作用,请参见下面的示例:

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';"

如何为 mysql 提供查询?

【问题讨论】:

  • 与问题无关,但您也可以通过在 .my.cnf 文件中设置主机、用户和密码来节省大量输入

标签: mysql linux bash unix stdin


【解决方案1】:

试试这样:

echo "select 1" | mysql

【讨论】:

    【解决方案2】:

    尝试像这样使用here document

    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
    

    或者将所有命令放在文本文件中并运行它:

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

    【讨论】:

    • +1 我还想提一下,如果查询使用反引号,则需要引用开始标签:mysql &lt;&lt;'END'
    【解决方案3】:
    mysql --batch --silent -e 'SHOW TABLES';
    

    如果您打算通过管道输出输出,批处理和静默会很方便

    【讨论】:

    • @cerd --batch without --silent 显示列标题
    【解决方案4】:

    您的尝试没有成功的原因是&lt; 需要一个文件名并且您输入了一个字符串。你必须做类似的事情

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

    ken的建议

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

    可以工作,但是如果您尝试在查询中使用 bash 变量,您可能会遇到参数扩展问题。例如

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

    可能不会如您所愿。 一种选择是使用

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

    如果查询字符串包含适当的引用,则有效。另一种选择是 dogbane 建议的“此处”文档。

    【讨论】:

    • 很好地解释了 OP 的错误。感谢您收集其他人的回复并解释警告!
    【解决方案5】:

    你试过mysql -e query吗?

    【讨论】:

      【解决方案6】:
      cat <<EOD | mysql [-u user] [-ppassword] [database]
        select 1;
        select 2;
        select 3;
      EOD
      

      你的情况

      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
      

      【讨论】:

        【解决方案7】:

        对于 bash 脚本中的大查询,您可以尝试:

        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
        

        【讨论】:

          猜你喜欢
          • 2011-12-06
          • 1970-01-01
          • 2017-03-16
          • 1970-01-01
          • 2020-09-14
          • 2019-10-09
          • 1970-01-01
          • 2012-03-22
          • 1970-01-01
          相关资源
          最近更新 更多