【发布时间】: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 SCHEMAorUSEare supported by Prepared statement ... -> 为什么是prepared statement? (为什么不“只执行”?)