Не удается заставить исходный запрос MySQL работать с модулем Python mysqldb - PullRequest
5 голосов
/ 19 декабря 2009

У меня есть следующие строки кода:

sql = "source C:\\My Dropbox\\workspace\\projects\\hosted_inv\\create_site_db.sql"
cursor.execute (sql)

Когда я выполняю свою программу, я получаю следующую ошибку:

Ошибка 1064: у вас ошибка в синтаксисе SQL; проверьте руководство, соответствующее вашей версии сервера MySQL, чтобы найти правильный синтаксис для использования рядом с 'source C: \ My Dropbox \ workspace \ projects \ hosted_inv \ create_site_db.sql' в строке 1

Теперь я могу скопировать и вставить следующее в mysql как запрос:

source C:\\My Dropbox\\workspace\\projects\\hosted_inv\\create_site_db.sql

И это прекрасно работает. Когда я проверяю журнал запросов на запрос, выполненный моим сценарием, он показывает, что мой запрос был следующим:

source C:\\My Dropbox\\workspace\\projects\\hosted_inv\\create_site_db.sql

Однако, когда я вставляю его вручную и выполняю, весь файл create_site_db.sql раскрывается в журнале запросов и показывает все запросы sql в этом файле.

Я что-то здесь упускаю из-за того, как mysqldb выполняет запросы? Я сталкиваюсь с ограничением. Моя цель - запустить скрипт sql для создания структуры схемы, но я не хочу вызывать mysql в процессе оболочки для получения файла sql.

Есть мысли? Спасибо!

Ответы [ 5 ]

12 голосов
/ 19 декабря 2009

Как уже говорили другие, вы не можете использовать команду source в MySQLdb Python API

Таким образом, вместо запуска загрузите файл и выполните его

Допустим, ваш файл .sql имеет

create database test;

Читать содержимое как

sql=open("test.sql").read()

А затем выполните его

cursor.execute(sql);

Вы получите новую базу данных «Тест»

7 голосов
/ 19 декабря 2009

Команда source является одной из встроенных команд , распознаваемых только клиентом командной строки mysql. Он не поддерживается как оператор, который вы можете выполнить через любой API.

Некоторые люди думают, что вы можете просто разделить файл сценария SQL на терминатор оператора ";" и вызывать execute() в каждой получаемой строке. Но есть множество исключительных случаев:

  • Операторы, которые являются встроенными командами , такими как CONNECT, SOURCE, CHARSET, WARNINGS, QUIT и т. Д.
  • Обратите внимание, что встроенные команды не должны заканчиваться на ;, например DELIMITER.
  • Операторы, которые содержат ;, но не в качестве терминатора, например CREATE TRIGGER.
  • Операторы, которые содержат ; внутри строковых литералов или комментариев или даже заключенных в кавычки идентификаторов.
  • Строки комментариев.

Чтобы программно загрузить SQL-скрипт, вам необходимо продублировать значительную часть функциональности клиента mysql. Поэтому лучше, если вы просто разветвите процесс, чтобы фактически выполнить эту клиентскую программу со сценарием в качестве входных данных.

Смотри также:

3 голосов
/ 19 декабря 2009

'source' - это не команда SQL, а внутренняя команда клиента командной строки mysql.

2 голосов
/ 05 апреля 2010

Я столкнулся с той же проблемой!

В качестве решения я установил библиотеку sqlparse и использовал результаты sqlparse.split (sql). Я должен был проверить, что sql_parts не содержит пустых строк в качестве отдельных выражений ... В противном случае "WOW" sqlparse довольно хорош и именно то, что мне нужно!

import sqlparse 
....
sql = open("test.sql").read()
sql_parts = sqlparse.split( sql )
for sql_part in sql_parts:
    if sql_part.strip() ==  '':
        continue 
    cursor.execute( sql_part )

К вашему сведению: если вы не выполняете каждый оператор самостоятельно , вы можете получить сообщение об ошибке «Команды не синхронизированы; вы не можете запустить эту команду сейчас». Я получил эту ошибку только после того, как добавил несколько запросов в свой файл sql - не в первый раз.

1 голос
/ 19 декабря 2009

Я считаю, что команда «source» специфична для исполняемого файла оболочки mysql - она ​​не является командой sql и не может быть правильно интерпретирована при выполнении в качестве оператора sql.

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

...