如何在“ USE database”语句中使用用户变量

时间:2019-01-30 14:30:16

标签: mysql sql

我想使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语句必须起作用,因此选择了正确的数据库并且创建表时不需要数据库名称。

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

2 个答案:

答案 0 :(得分:0)

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

# 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;

答案 1 :(得分:0)

有一种方法,您可以像在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