我想使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
语句必须起作用,因此选择了正确的数据库并且创建表时不需要数据库名称。
感谢任何有用的提示,谢谢:)。
答案 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