Импорт большого файла .sql с php и zend framework - PullRequest
3 голосов
/ 09 марта 2012

Мне нужно импортировать (большой) .sql файл в MySQL с PHP и фреймворком Zend.

Соединение открыто, и у меня есть $_sql, содержащий все содержимое файла SQL, но - конечно, простое

$this->db->query($_sql);

не будет работать.

Что я могу сделать, чтобы импортировать этот большой файл?

Обновление: да, это mysql-dump с определениями структуры моей mysql-базы данных. И да, он должен запускаться изнутри php без использования командной строки.

РЕШИТЬ: Мне нужен объект mysqli, чтобы это исправить, mysqli-> multiQuery - это путь. Вот как выглядит мой (модульный тест) загрузчик:

<?php

// Define path to application directory
defined('APPLICATION_PATH')
    || define('APPLICATION_PATH', realpath(dirname(__FILE__) . '/../application'));

// Define application environment
defined('APPLICATION_ENV')
    || define('APPLICATION_ENV', (getenv('APPLICATION_ENV') ? getenv('APPLICATION_ENV') : 'testing'));

// Ensure library/ is on include_path
set_include_path(implode(PATH_SEPARATOR, array(
    realpath(APPLICATION_PATH . '/../library'),
    get_include_path(),
)));

require_once 'Zend/Loader/Autoloader.php';
Zend_Loader_Autoloader::getInstance();

// Create application, bootstrap, and run
$application = new Zend_Application(
        APPLICATION_ENV,
        APPLICATION_PATH . '/configs/application.ini'
);

$options = $application->getOptions();

$_sqlFile = realpath(APPLICATION_PATH.'\\..\\tests\\sql\\');
$_sqlFile .= '\\myLargeSQL.sql';
$sql = file_get_contents($_sqlFile);
$mysqliobject = new mysqli(
        $options['resources']['db']['params']['host'],
        $options['resources']['db']['params']['username'],
        $options['resources']['db']['params']['password'],
        $options['resources']['db']['params']['dbname']
);
$mysqliobject->multi_query($sql);

if ($mysqliobject->errno <> 0) {
    throw new Exception('Error creating temp database in ('.__FILE__.' on line '.__LINE__.')');
}

$mysqliobject->close();

Не беспокойтесь о \, это только временно (скоро это исправят), и да, я на Windows-машине. Так что, может быть, кто-то может использовать его.

Ответы [ 4 ]

1 голос
/ 10 марта 2012

Вы могли бы сделать это с помощью следующего кода.

$db = Zend_Db_Table::getDefaultAdapter();
$db->beginTransaction();
$sql = file_get_contents(APPLICATION_PATH . '/path/to/your/data.sql');
$db->query($sql);
$db->commit();

Однако, если ваш sql слишком большой, он может превысить максимальное время выполнения php. Я бы порекомендовал вам создать скрипт php и запустить его из командной строки php. Например, в вашей общей папке создайте скрипт php с именем import.php

 <?php

 // Define path to application directory
 defined('APPLICATION_PATH')
    || define('APPLICATION_PATH', realpath(dirname(__FILE__) . '/../application'));

 // Define application environment
 defined('APPLICATION_ENV')
    || define('APPLICATION_ENV', (getenv('APPLICATION_ENV') ? getenv('APPLICATION_ENV') : 'development'));

 // Ensure library/ is on include_path
 set_include_path(implode(PATH_SEPARATOR, array(
        realpath(APPLICATION_PATH . '/../library'),
        get_include_path(),
    )));

 /** Zend_Application */
 require_once 'Zend/Application.php';

 // Create application, bootstrap, and run
 $application = new Zend_Application(
            APPLICATION_ENV,
            APPLICATION_PATH . '/configs/application.ini'
 );

 $options = $application->getOptions();

 $db = Zend_Db::factory($options['resources']['db']['adapter'], array(
        'host' => $options['resources']['db']['params']['host'],
        'username' => $options['resources']['db']['params']['username'],
        'password' => $options['resources']['db']['params']['password'],
        'dbname' => $options['resources']['db']['params']['dbname']
    ));

 //OR 
 //$application->getBootstrap()->bootstrap('db');
 //$db = Zend_Db_Table::getDefaultAdapter();

 $db->beginTransaction();
 $sql = file_get_contents(APPLICATION_PATH . '/path/to/your/data.sql');
 $db->query($sql);
 $db->commit();

Убедитесь, что ваш application.ini имеет адаптер таблицы базы данных по умолчанию, как документация zendframework. В противном случае вы можете настроить параметры базы данных вручную. В этом примере вы можете поместить файл sql в папку приложения. Вы можете изменить его в соответствии со своими потребностями.

Затем вы можете запустить его из командной строки, перейти в общую папку в командной строке и запустить команду

 php import.php

Обновление:

Еще один простой способ импортировать большие sql-файлы - использовать инструмент. Я привык использовать Navicat (http://www.navicat.com/en/products/navicat_premium/premium_overview.html). Это так легко и быстро импортировать / экспортировать

1 голос
/ 10 марта 2012

Вероятно, самый быстрый способ импортировать большой файл - это cli:

mysql -u username -p databasename < yourfile.sql
0 голосов
/ 12 марта 2012

http://www.mysqldumper.net/

Это веб-приложение с открытым исходным кодом. Если вы не хотите его использовать, вы можете просмотреть Код и посмотреть, как они это делают. Это открытый исходный код.

MySQL-Dumper может обрабатывать файлы .sql с 200 + МБ ...

0 голосов
/ 10 марта 2012

Я думаю, это не задача для ZF.Попробуйте использовать Sypex Dymper - http://sypex.net/en/ - идеальный инструмент для импорта / экспорта SQL

...