使用Zend_Db_Adapter创建数据库

时间:2011-08-10 13:22:38

标签: php zend-framework zend-db zend-db-table

我正在努力使用我的应用程序的一部分,我使用Zend_Db_Adapter在每个客户端注册的mysql中创建数据库模式。

我有一个数据库脚本,其中包含创建表的所有DDL,然后我读取文件的内容,然后使用Zend_Db_Adapter执行它。在创建数据库之后,我想使用相同的适配器用一些数据填充它。但是,这总是会失败并出现如下错误:

  

2011-08-10T14:15:16 + 01:00调试(7):SQLSTATE [42S02]:未找到基表或视图:1146表'client_3.users'不存在

有人能看到我的代码中哪些地方有点错误吗?我已经让MySQL登录以查看任何错误,并且似乎没有任何错误,并且DDL脚本在手动运行时工作正常。

$databaseName = 'client_' . $clientId;
$createDbStr = "DROP DATABASE IF EXISTS ".$databaseName."; CREATE DATABASE " . $databaseName.";";

            $dbAdapter->getConnection()->exec($createDbStr);

            //we now create the database adapter for the new database on the server
            //as we now populate the user data in the databaes.
            $newDbAdapter = Zend_Db::factory('Pdo_Mysql', array(
                'host' => 'localhost',
                'username' => 'appdbuser',
                'password' => 'appdbpassword',
                'dbname' => $databaseName
            ));


            //we now load the SQL Script that is used to create the database schema.
            $sqlScriptPath = APPLICATION_PATH . DIRECTORY_SEPARATOR . 'datamodel' . DIRECTORY_SEPARATOR . 'client_schema.sql';
            $fileUtils = new App_FileSystem_FileUtility();
            $sqlScript = "USE ".$databaseName.";";
            $sqlScript .= $fileUtils->getFileContents($sqlScriptPath);

            //debug sql script;
            App_Application_Log::getInstance()->log($sqlScript, Zend_Log::DEBUG);

            //we now create the schema
            $newDbAdapter->getConnection()->exec($sqlScript);


            $usersTable = new Application_Model_UsersTable($newDbAdapter);
            $newUserTableData = array(
                'username' => 'Administrator',
                'fullname' => $contactName',
                'email' => $email,
                'uuid' => App_Security_Uuid::getInstance()->getUuid(),
                'create_date' => new Zend_Db_Expr('now()'),                
            );

            $userId = $usersTable->insert($newUserTableData); //errors here

在我开始使用数据填充之前,是否需要从运行DDL脚本中完成一个步骤?

谢谢,

捐赠

2 个答案:

答案 0 :(得分:1)

我认为$dbAdapter->getConnection()->exec($createDbStr);不会像你一样运行两个SQL语句。将每个语句拆分为自己的语句(drop table if existscreate table

答案 1 :(得分:0)

我现在有一个解决这个问题的方法,我希望能帮助别人。

我所做的是确保create_schema.sql脚本在DDL中具有数据库名称

e.g。

CREATE TABLE `dbname`.`users`(
 userid INT,
 username VARCHAR(255)
)

然后,我在我的PHP代码中找到了替换使用数据库名称的str_replace函数和客户端数据库的名称。

$sqlScriptPath = APPLICATION_PATH . DIRECTORY_SEPARATOR . 'datamodel' . DIRECTORY_SEPARATOR . 'client_schema.sql';
            $fileUtils = new App_FileSystem_FileUtility();            
            $sqlScript = str_replace('dbname', $databaseName, $fileUtils->getFileContents($sqlScriptPath));

            //debug sql script;
            App_Application_Log::getInstance()->log($sqlScript, Zend_Log::DEBUG);

            //we now create the schema
            $newDbAdapter->getConnection()->exec($sqlScript);

然后按照SQL脚本中的描述创建所有表和索引。

希望这会有所帮助。