Выполнение списка запросов MySQL без использования exec () - PullRequest
2 голосов
/ 27 февраля 2010

У меня есть сайт, который требует ручного создания таблиц базы данных при установке. На данный момент они сохраняются (вместе с любыми исходными данными) в коллекции файлов .sql.

Я пытался автоматически создавать с помощью exec () с CLI MySQL, и хотя он работает на нескольких платформах, он довольно ненадежный, и мне не очень нравится делать это таким образом, к тому же сложно отлаживать ошибки и далеко не пуленепробиваемый (особенно если исполняемый файл MySQL отсутствует в системном пути).

Есть ли лучший способ сделать это? Команда MySQL query () разрешает только один SQL-оператор на запрос (что является камнем преткновения).

MySQLi, который я слышал, может решить некоторые из этих проблем, но я честно инвестирую в оригинальную библиотеку MySQL, но хотел бы переключиться, если она стабильна, совместима и обычно поддерживается в стандартной сборке сервера и является улучшением в целом .

Если это не удастся, я, вероятно, захочу сделать что-то вроде создания из массива / структуры данных PHP - что, возможно, чище, поскольку оно сможет обновлять таблицы в соответствии со схемой на месте. Я предполагаю, что это может быть проблемой, которая уже была решена, поэтому любые ссылки на любые примеры реализации с аргументами «за» и «против» будут полезны!

Заранее благодарим за понимание.

Ответы [ 3 ]

1 голос
/ 27 февраля 2010

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

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

Другой вариант - взглянуть на Phing и dbdeploy для управления базами данных .

1 голос
/ 27 февраля 2010

Если вы используете это для переноса данных между системами, рассмотрите возможность использования синтаксиса LOAD DATA INFILE (http://dev.mysql.com/doc/refman/5.1/en/load-data.html) после использования SELECT ... INTO OUTFILE (http://dev.mysql.com/doc/refman/5.1/en/select.html)

)
0 голосов
/ 27 февраля 2010

Вы можете запускать команды создания / обновления схемы через стандартные функции PHP mysql_ *. И если команда query (), которую вы вызываете, разрешит только один оператор, просто вызовите его много раз.

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

Вы должны проверять ошибки после каждого оператора и предпринимать корректирующие действия в случае его сбоя (если только вы не используете InnoDB, в этом случае вы можете заключить все операторы в транзакцию и выполнить откат в случае сбоя.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...