我正在努力使用我的应用程序的一部分,我使用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脚本中完成一个步骤?
谢谢,
捐赠
答案 0 :(得分:1)
我认为$dbAdapter->getConnection()->exec($createDbStr);
不会像你一样运行两个SQL语句。将每个语句拆分为自己的语句(drop table if exists
和create 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脚本中的描述创建所有表和索引。
希望这会有所帮助。