2012-03-09 58 views
3

我必須用PHP和Zend框架將(大).sql文件導入到MySQL中。用php和zend框架導入大型的.sql文件

連接是打開的,我有$_sql包含SQL文件的全部內容,但 - 當然,一個簡單的

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

將無法​​正常工作。

我能做些什麼來導入這個大文件?

更新:是的,它是一個mysql-dump與我的mysql數據庫的結構定義。是的,它需要從內部運行而不使用命令行。

求助: 我需要一個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機器上。所以,也許有人可以使用它。

+0

是該文件的mysqldump的結果呢? – 2012-03-09 15:38:43

+0

SQL文件是一個巨大的SQL語句還是多個較小的?如果它是多個較小的,則可以一次運行一個命令的SQL文件。 – 2012-03-09 16:08:40

+2

你真的需要使用ZF執行查詢嗎?我通常使用'source'命令爲大型'.sql'文件恢復命令行'mysql'。 – 2012-03-09 16:09:35

回答

0

我想,這不是ZF的任務。嘗試使用sypex dymper - http://sypex.net/en/ - 用於sql導入/導出的完美工具

+0

或者使用http://www.ozerov.de/bigdump/ – Daan 2012-03-09 22:59:25

+0

需要使用php cli,不需要外部工具(我已經有了一個)。 – Paladin 2012-03-12 08:33:44

1

你可以用下面的代碼來完成它。

$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命令行運行它。例如,在公共文件夾中創建名爲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(); 

php腳本確保你的application.ini有一個默認的數據庫表適配器zendframework文檔。否則,您可以手動配置數據庫設置。在這個例子中,你可以把sql文件放在應用程序文件夾中。你可以改變以適應你的需要。

然後你可以從你的命令行運行它,去公共文件夾中的命令行,然後運行命令

php import.php 

更新:

另一種簡單的方法來導入大型SQL文件,它會使用一個工具。我習慣使用Navicat(http://www.navicat.com/en/products/navicat_premium/premium_overview.html)。它是如此方便,快捷的導入/導出

+0

謝謝,但它不起作用。也許是因爲,有許多sql-code(mysql-dump)的行。在第二行有錯誤。當我命令第一個,錯誤在第三,所以我認爲這是一個問題;不知何故。當我在phpMyAdmin中執行相同的sql時,一切運作良好。 – Paladin 2012-03-12 08:33:10

+0

嗯是的,也許可以吧,我一直在使用它的長期SQL文件,並正常工作。無論如何,我看到你找到了解決方案,你需要回答或選擇一個答案:) @SaschaPresnac – dextervip 2012-03-12 22:21:19

1

可能最快的方式導入大型文件使用CLI:

mysql -u username -p databasename < yourfile.sql 
+0

對不起,我需要使用php cli的,但謝謝 – Paladin 2012-03-12 08:33:28

0

http://www.mysqldumper.net/

這是一個開源的Web應用程序。如果你不想使用它,你可以瀏覽代碼,看看他們是如何做到的。它是開源的。

MySQL的自卸車可以處理.sql文件有200 MB + ...

+0

需要使用php cli,對不起 – Paladin 2012-03-12 08:54:53