【问题标题】:How to use a user variable in 'USE database' statement如何在“使用数据库”语句中使用用户变量
【发布时间】:2019-01-30 14:30:16
【问题描述】:

我想为我的 MYSQL 数据库变量命名,以便可以从外部(python 脚本)将其设置为我喜欢的任何内容。从而避免硬编码数据库的名称。

我尝试通过在 mysql 客户端中定义用户变量来传递名称,然后加载 sql 脚本。我能够创建数据库,但无法通过 USE 语句连接到它

变量的定义调用sql脚本

mysql> SET @database_name = 'name';
mysql> SOURCE script.sql;

script.sql的代码:

-- creating database according to user variable
SET @query = CONCAT('CREATE SCHEMA IF NOT EXISTS ', @database_name, ' DEFAULT CHARACTER SET latin1');
PREPARE stmt FROM @query; EXECUTE stmt; DEALLOCATE PREPARE stmt;

-- selecting the database according to the user variable
SET @query = CONCAT('USE ', @database_name);
PREPARE stmt FROM @query; EXECUTE stmt; DEALLOCATE PREPARE stmt;

我以为这会起作用,但没想到 MYSQL 把这个错误扔到了我的脸上:

This command is not supported in the prepared statement protocol yet

问题是,这个脚本中有很多表定义,而且前面都需要实际的数据库名,或者USE语句必须起作用,所以选择了正确的数据库并且没有创建表时需要数据库名称。

感谢您提供任何有用的提示,谢谢 :)。

【问题讨论】:

  • 您知道您可以像这样在 SELECT/INSERT/UPDATE 查询中使用数据库名称吗? SELECT * FROM <database_name>.<table_name> 那么你就不必像你已经说过的那样使用USE <database_name>,我认为这是你唯一的解决方法。或者更合乎逻辑的地方是 USE 在 .sql 文件中。
  • 问题是,我使用CREATE TABLE,但它是无效的,很遗憾。
  • 数据库的创建工作,我从来没有说过它不工作。正如我所说,问题在于USE 声明。我想连接到数据库,这样我就可以创建表而不必提供数据库名称,因为这需要更多准备好的语句,并且我想避免所有表创建的准备好的语句。
  • “数据库的创建工作,我从来没有说过它不工作”是的,我删除了我非常需要一些咖啡的评论......
  • 根据manual 8.0 or CREATE SCHEMA or USE are supported by Prepared statement ... -> 为什么是prepared statement? (为什么不“只执行”?)

标签: mysql sql


【解决方案1】:

如果您具有FILE 权限并且还设置了secure_file_priv 系统变量max_allowed_packet 也可能会更改,则“复杂”解决方法可能是生成.sql 文件。

# SET SESSION max_allowed_packet = '<>'; commented because it might be needed to generate larger .sql file 

SET SESSION group_concat_max_len = @@max_allowed_packet;

SELECT 
 GROUP_CONCAT(sql_lines.line SEPARATOR ';');
FROM (
  SELECT CONCAT('CREATE SCHEMA IF NOT EXISTS ', @database_name, 'DEFAULT CHARACTER SET latin1') AS line
  UNION 
  SELECT CONCAT('USE ', @database_name) AS line
) AS sql_lines
CROSS JOIN (
  SELECT @database_name = '<test>'
) AS init_user_param 
INTO
 DUMPFILE '<absolute_file_path>';

SOURCE script.sql;

【讨论】:

    【解决方案2】:

    有一种方法,您可以像在 sql 提示符下键入一样生成 sql。您可以像键入一样编写所有内容,但使用 bash 脚本:

    这样的代码(文件名:generate-database.sh):

    #!/bin/bash
    
    mydatabase="mytest";
    
    cat << EOF
    create database $mydatabase;
    use $mydatabase;
    create table test1 (id int);
    create table test2 (id int);
    
    EOF
    

    如果您想为其他站点创建数据库,您甚至可以将数据库名称作为第一个参数传递。然后你会做这样的事情:

    bash generate-database.sh | mysql -u <username> -p
    

    然后,它会像在 mysql 中键入一样执行所有操作。

    要作为第一个参数传入,您可以这样做:

    mydatabase=$1;
    

    在命令提示符下,您可以这样做:

    bash generate-database.sh MarkTownsend | mysql -u <username> -p
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-07-29
      • 2013-02-26
      • 1970-01-01
      • 2011-01-12
      • 1970-01-01
      • 1970-01-01
      • 2011-04-06
      • 2012-09-12
      相关资源
      最近更新 更多