Как использовать пользовательскую переменную в операторе «USE database»

0

Я хочу сделать имя моей переменной базы данных 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
    Вы знаете, что можете использовать имя базы данных в запросах SELECT / INSERT / UPDATE, как это? SELECT * FROM <database_name>.<table_name> тогда вам не нужно будет использовать USE <database_name> как вы уже сказали, я думаю, что это ваш единственный обходной путь ... Или, что более логично, поместите USE в файл .sql.
  • 0
    Проблема в том, что я использую CREATE TABLE и там, к сожалению, это не действительно.
Показать ещё 5 комментариев
Теги:

2 ответа

0

"Сложный" обходной путь может заключаться в создании файла .sql если у вас есть привилегия FILE и установлена системная переменная secure_file_priv, также может быть изменен max_allowed_packet.

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

Есть способ, вы можете сгенерировать sql так, как вы его набирали в командной строке sql. Вы можете написать все, как вы печатаете, но используя скрипт bash:

Код как это:

#!/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.sql | mysql -u <username> -p

Тогда все будет так, как если бы вы печатали его в mysql.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню