Создание базы данных MySQL из Python 2.7

5065584

Я знаю, что базой данных MySQL можно управлять из программы на Питоне посредством модуля MySQLDb. Но это предполагает, что база данных уже создана. А можно ли именно СОЗДАТЬ базу данных из Питона?

uncle17

Подключаешься и говоришь "CREATE DATABASE IF NOT EXISTS myDB"
Естественно, с соответствующими правами

5065584

А что делать, если в этот запрос нужно подставить значение? У меня происходит вот что:
 
basename='testdb'
cursor.execute("CREATE DATABASE IF NOT EXISTS %s;",basename)

В недрах MySqlDb это порождает запрос вида
 
"CREATE DATABASE IF NOT EXISTS \\'testdb\\';"
, который MySQL не понимает.

khachin

С MySQLdb не работал (предпочитаю SQLA но полагаю, что в данном случае надо cursor.execute("CREATE DATABASE IF NOT EXISTS %s;"%basename)

apl13

%s
Питон не умеет в плейсхолдеры? :ooo:

Plok2008

Не, всё он правильно написал. Это не простая подстановка строки, а сам курсор сделает необходимые эскейпы пепеменных и уже потом вставит их в нужные места в строке запроса.
Однако почему запрос не выполняется пока не понятно. Нужно больше информации, какую именно ошибку возвращает MySQL server.
[телепат-моде]Может данному пользователю не достаточно прав на CREATE DATABASE?[/telepat-mode]

khachin

Просто я опирался на ответ в stackoverflow.

db1 = MS.connect(host="localhost",user="root",passwd="****")
cursor = db1.cursor
sql = 'CREATE DATABASE mydata'
cursor.execute(sql)

Имя базы без кавычек (отсутствие ; в конце запроса опустим, его наличие движок должен съесть). А у ТС двойной эскейпинг строки на выходе приготовлен.
Я предположил, что эскейпинг (в зависимости от типа) необходим, чтобы вносить строковые и не строковые значения уже в саму базу.
 
cursor.execute(
"""INSERT INTO breakfast (name, spam, price)
VALUES (%s, %s, %s)""""Spam Plate", 5, 7.95 )
)

kill-still

а если так пропихнуть? ^_^
SET @db = %s;
SET @statement = CONCAT('CREATE DATABASE ', @db);
PREPARE prepared_statement FROM @statement;
EXECUTE prepared_statement;

Plok2008

Ой, да, я немножко протупил. Название базы и полей не следует эскейпить. Ну т.е. если там что-то кривое, или имя столбца order, то тогда я руками сам его эскейпил до `order`.
Так что твой первый коммент про cursor.execute(statement) должно работать. Где statement - уже полностью подготовленная строка с названием базы данных без кавычек.
Оставить комментарий
Имя или ник:
Комментарий: