yiic ошибка миграции, не удалось открыть поток
Я недавно столкнулся с проблемой при попытке применить миграцию базы данных с помощью Yii.
Сначала я создаю новую миграцию, используя эту:: ./yiic migrate create tr
Это дает мне следующий вывод.
Yii Migration Tool v1.0 (на основе Yii v1.1.14)
Создать новую миграцию '/var/www/html/Trackstar/protected/migrations/m130921_101251_tr.php'? (да | нет) [нет]:y Новая миграция успешно создана.
Что показывает, что я создал новую миграцию.
Теперь я добавил необходимый ddl в up() и down(). Вот как это выглядит.
<?php
class m130921_101251_tr extends CDbMigration {
public function up() {
//create the issue table
$this->createTable('tbl_issue', array(
'id' => 'pk',
'name' => 'string NOT NULL',
'description' => 'text',
'project_id' => 'int(11) DEFAULT NULL',
'type_id' => 'int(11) DEFAULT NULL',
'status_id' => 'int(11) DEFAULT NULL',
'owner_id' => 'int(11) DEFAULT NULL',
'requester_id' => 'int(11) DEFAULT NULL',
'create_time' => 'datetime DEFAULT NULL',
'create_user_id' => 'int(11) DEFAULT NULL',
'update_time' => 'datetime DEFAULT NULL',
'update_user_id' => 'int(11) DEFAULT NULL',
), 'ENGINE=InnoDB');
//create the user table
$this->createTable('tbl_user', array(
'id' => 'pk',
'username' => 'string NOT NULL',
'email' => 'string NOT NULL',
'password' => 'string NOT NULL',
'last_login_time' => 'datetime DEFAULT NULL',
'create_time' => 'datetime DEFAULT NULL',
'create_user_id' => 'int(11) DEFAULT NULL',
'update_time' => 'datetime DEFAULT NULL',
'update_user_id' => 'int(11) DEFAULT NULL',
), 'ENGINE=InnoDB');
//create the assignment table that allows for many-to-many
//relationship between projects and users
$this->createTable('tbl_project_user_assignment', array(
'project_id' => 'int(11) NOT NULL',
'user_id' => 'int(11) NOT NULL',
'PRIMARY KEY (`project_id`,`user_id`)',
), 'ENGINE=InnoDB');
//foreign key relationships
//the tbl_issue.project_id is a reference to tbl_project.id
$this->addForeignKey("fk_issue_project", "tbl_issue", "project_id", "tbl_project", "id", "CASCADE", "RESTRICT");
//the tbl_issue.owner_id is a reference to tbl_user.id
$this->addForeignKey("fk_issue_owner", "tbl_issue", "owner_id", "tbl_user", "id", "CASCADE", "RESTRICT");
//the tbl_issue.requester_id is a reference to tbl_user.id
$this->addForeignKey("fk_issue_requester", "tbl_issue", "requester_id", "tbl_user", "id", "CASCADE", "RESTRICT");
//the tbl_project_user_assignment.project_id is a reference to tbl_project.id
$this->addForeignKey("fk_project_user", "tbl_project_user_assignment", "project_id", "tbl_project", "id", "CASCADE", "RESTRICT");
//the tbl_project_user_assignment.user_id is a reference to tbl_ user.id
$this->addForeignKey("fk_user_project", "tbl_project_user_assignment", "user_id", "tbl_user", "id", "CASCADE", "RESTRICT");
}
public function down() {
$this->truncateTable('tbl_project_user_assignment');
$this->truncateTable('tbl_issue');
$this->truncateTable('tbl_user');
$this->dropTable('tbl_project_user_assignment');
$this->dropTable('tbl_issue');
$this->dropTable('tbl_user');
}
/*
// Use safeUp/safeDown to do migration with transaction
public function safeUp()
{
}
public function safeDown()
{
}
*/
}
Теперь проблема в том, что всякий раз, когда я пытаюсь применить эту миграцию, используя./yiic migrate, происходит сбой с той же ошибкой. Вот пример выходных данных, которые я получаю.
[root@localhost protected]# ./yiic migrate
Yii Migration Tool v1.0 (based on Yii v1.1.14)
Total 1 new migration to be applied:
m130921_101251_tr
Apply the above migration? (yes|no) [no]:y
*** applying m130921_101251_tr
PHP Error[2]: include(m130921_101251_tr.php): failed to open stream: No such file or directory
in file /var/www/html/yii/framework/YiiBase.php at line 427
#0 /var/www/html/yii/framework/YiiBase.php(427): autoload()
#1 unknown(0): autoload()
#2 /var/www/html/yii/framework/cli/commands/MigrateCommand.php(429): spl_autoload_call()
#3 /var/www/html/yii/framework/cli/commands/MigrateCommand.php(384): MigrateCommand->instantiateMigration()
#4 /var/www/html/yii/framework/cli/commands/MigrateCommand.php(109): MigrateCommand->migrateUp()
#5 unknown(0): MigrateCommand->actionUp()
#6 /var/www/html/yii/framework/console/CConsoleCommand.php(172): ReflectionMethod->invokeArgs()
#7 /var/www/html/yii/framework/console/CConsoleCommandRunner.php(71): MigrateCommand->run()
#8 /var/www/html/yii/framework/console/CConsoleApplication.php(92): CConsoleCommandRunner->run()
#9 /var/www/html/yii/framework/base/CApplication.php(180): CConsoleApplication->processRequest()
#10 /var/www/html/yii/framework/yiic.php(33): CConsoleApplication->run()
#11 /var/www/html/Trackstar/protected/yiic.php(7): require_once()
#12 /var/www/html/Trackstar/protected/yiic(4): require_once()
Я не могу найти решение для вышеуказанной проблемы. Я искал на форумах google, stackru и yii соответствующие ответы, но я не нашел ни одного. Пожалуйста, предоставьте любую помощь о том, как решить эту проблему. Я новичок в Yii, так что я все еще учусь, и мне это нравится. Но застревание на первых шагах - реальная неудача. Любая помощь будет высоко ценится.
Спасибо, макс
Для уточнения. Я выкладываю config / console.php и config / main.php
------------- конфигурации / console.php -------------------------
<?php
// This is the configuration for yiic console application.
// Any writable CConsoleApplication properties can be configured here.
return array(
'basePath'=>dirname(__FILE__).DIRECTORY_SEPARATOR.'..',
'name'=>'My Console Application',
// preloading 'log' component
'preload'=>array('log'),
// application components
'components'=>array(
// uncomment the following to use a MySQL database
'db'=>array(
'connectionString' => 'mysql:host=localhost;dbname=trackstar',
'emulatePrepare' => true,
'username' => 'user1',
'password' => 'mydb389',
'charset' => 'utf8',
),
'log'=>array(
'class'=>'CLogRouter',
'routes'=>array(
array(
'class'=>'CFileLogRoute',
'levels'=>'error, warning',
),
),
),
),
);
--------------------- конец console.php ----------------------
------------------------ конфигурации / main.php --------------------- -
<?php
// uncomment the following to define a path alias
// Yii::setPathOfAlias('local','path/to/local-folder');
// This is the main Web application configuration. Any writable
// CWebApplication properties can be configured here.
return array(
'basePath'=>dirname(__FILE__).DIRECTORY_SEPARATOR.'..',
'name'=>'My Web Application',
// preloading 'log' component
'preload'=>array('log'),
// autoloading model and component classes
'import'=>array(
'application.models.*',
'application.components.*',
),
'modules'=>array(
// uncomment the following to enable the Gii tool
/*
'gii'=>array(
'class'=>'system.gii.GiiModule',
'password'=>'Enter Your Password Here',
// If removed, Gii defaults to localhost only. Edit carefully to taste.
'ipFilters'=>array('127.0.0.1','::1'),
),
*/
),
// application components
'components'=>array(
'user'=>array(
// enable cookie-based authentication
'allowAutoLogin'=>true,
),
// uncomment the following to enable URLs in path-format
/*
'urlManager'=>array(
'urlFormat'=>'path',
'rules'=>array(
'<controller:\w+>/<id:\d+>'=>'<controller>/view',
'<controller:\w+>/<action:\w+>/<id:\d+>'=>'<controller>/<action>',
'<controller:\w+>/<action:\w+>'=>'<controller>/<action>',
),
),
*/
// uncomment the following to use a MySQL database
'db'=>array(
'connectionString' => 'mysql:host=localhost;dbname=trackstar',
'emulatePrepare' => true,
'username' => 'user1',
'password' => 'mydb389',
'charset' => 'utf8',
),
'errorHandler'=>array(
// use 'site/error' action to display errors
'errorAction'=>'site/error',
),
'log'=>array(
'class'=>'CLogRouter',
'routes'=>array(
array(
'class'=>'CFileLogRoute',
'levels'=>'error, warning',
),
// uncomment the following to show log messages on web pages
/*
array(
'class'=>'CWebLogRoute',
),
*/
),
),
),
// application-level parameters that can be accessed
// using Yii::app()->params['paramName']
'params'=>array(
// this is used in contact page
'adminEmail'=>'webmaster@example.com',
),
);
----------------------------- конец config / main.php -------------- --------
mysql> show tables
-> ;
+-------------------------+
| Tables_in_trackStar |
+-------------------------+
| tbl_migration |
+-------------------------+
1 row in set (0.00 sec)
mysql> desc tbl_migration;
+------------+--------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+------------+--------------+------+-----+---------+-------+
| version | varchar(255) | NO | PRI | NULL | |
| apply_time | int(11) | YES | | NULL | |
+------------+--------------+------+-----+---------+-------+
2 rows in set (0.00 sec)
2 ответа
РЕДАКТИРОВАТЬ: Вы не должны переименовывать свои классы файлов миграции, так как имя файла связано с tbl_migrations в вашей базе данных. Поэтому переименуйте ваш файл миграции в класс как
<?php
class m130921_101251_tr extends CDbMigration {
EDIT2: также убедитесь, что ваше имя файла protected/migrations/m130921_101251_tr.php
РЕДАКТИРОВАТЬ 3: Ниже приведен логический поток, как работает миграция Yii, возможно, это поможет
Yii Migration Tool v1.0 (based on Yii v1.1.14)
Достижение этой точки означает, что фреймворк включен, и ваши настройки yiic.php верны.
Total 1 new migration to be applied:
m130921_101251_tr
Эта пара строк означает, что yiic смог просканировать ваш каталог миграций, а также соединиться с вашей базой данных и проверить все файлы в вашей папке миграций и посмотреть, существует ли строка в tbl_migrations с тем же именем. Файлы, которые не имеют строки или перечислены как новые миграции
Apply the above migration? (yes|no) [no]:y
*** applying m130921_101251_tr
Эта строка вывода означает, что yiic теперь пытается применить миграцию, для этого он попытается найти класс того же типа, который расширяет CDbMigration
рамочный класс. Если yiic не может найти этот класс, вы получите эту ошибку.
PHP Error[2]: include(m130921_101251_tr.php): failed to open stream: No such file or directory in file /var/www/html/yii/framework/YiiBase.php at line 427
Как работает Yii, он всегда ищет имена классов, совпадающие с именами файлов, используя namspaces, который доступен только в PHP 5.3 и выше. Из документов Yii
Классы пространств имен Класс пространств имен относится к классу, объявленному в неглобальном пространстве имен. Например, класс application\components\GoogleMap объявлен в пространстве имен application\components. Для использования классов пространства имен требуется PHP 5.3.0 или выше.
Начиная с версии 1.1.5, можно использовать класс пространства имен без его явного включения. Например, мы можем создать новый экземпляр application\components\GoogleMap без явного включения соответствующего файла класса. Это стало возможным благодаря усовершенствованному механизму автозагрузки класса Yii.
Единственные случаи, когда я смог смоделировать вашу ошибку, это когда я не использую Php 5.3 или выше или имя класса не соответствует файлу
Файл не включен должным образом.
include(m130921_101251_tr.php);
вот почему он не может найти ваш класс.
Попробуйте указать правильный путь для вашего файла в вашем include
построить.