Будет ли этот тип bash работать так, как ожидалось?

#bash

#bash

Вопрос:

 #!/bin/bash

MYSQL="/usr/bin/mysql -uroot "

function create_db()
{
    local db_name=${1}

    $MYSQL<<!
    create database IF NOT EXISTS ${db_name};
!
}

###-------------------------tb_bind_userid_xxx-------------------------------------
function create_table_userid
{
    $MYSQL << !
    create table if NOT EXISTS bind_pay.tb_bind_userid_${1}(
        b_userid bigint not null, 
    b_membercode bigint not null , 
  PRIMARY KEY  (b_userid)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
!
}
  

$MYSQL Будет постоянным при вызовах функций или каждый раз будет повторно подключаться?

Я не думаю, что create_table_userid если он каждый раз повторно подключается, он будет работать так, как ожидалось, потому что в нем еще не указано имя базы данных.

Ответ №1:

Ну, поскольку вы будете вызывать функцию каждый раз, когда захотите создать таблицу, вы будете вызывать mysql для подключения к базе данных каждый раз. Если вам нужно постоянное соединение, один из способов — использовать библиотеку mysql, которая поддерживается большинством основных языков программирования в наши дни, Perl / Python / Ruby / PHP и т.д. Вы можете установить соединение с базой данных, затем делать все, что захотите, а затем, наконец, закрыть соединение. например, в документации Python/Mysql

    import MySQLdb
   conn = MySQLdb.connect (host = "localhost",
                           user = "testuser",
                           passwd = "testpass",
                           db = "test")
   cursor = conn.cursor ()
   cursor.execute ("SELECT VERSION()")
   row = cursor.fetchone ()
   print "server version:", row[0]
   cursor.close ()
   conn.close ()
  

Как вы можете видеть, для подключения к базе данных открыто соединение conn . Затем, используя дескриптор соединения (или, скорее, дескриптор базы данных), все выполняется, и затем, наконец, соединение закрывается.

Комментарии:

1. @wireshark, как написано в вопросе, для каждого вызова $ MYSQL существует отдельный процесс, поэтому он не может быть постоянным.

Ответ №2:

$MYSQL это просто переменная, поэтому ваш код запускает mysql каждый раз, когда он вызывает одну из этих функций.

Вы можете достаточно легко создать постоянное соединение с mysql; просто попросите вашу программу записать свой sql для вывода, а затем передать все результаты в mysql:

 (
  create_table "foo"
  create_table "bar"
) | mysql

create_table() {
  cat <<!
create table $1 ....
!
}