Являются грабли db:migrate корректной командой, чтобы повторно синхронизировать schema.rb с Вашей схемой базы данных?

Основная проблема, я полагаю, заключается в выражении sql - в нем отсутствует запятая между u_add и u_pass

$reg = $db->prepare('INSERT INTO bakery_users (u_name, u_mail, u_add, u_pass) VALUES (:u_name, :u_mail, :u_add, :u_pass)');

Если вы проверяете возвращаемое значение prepare, вы можете форк логика зависит от его успеха / неудачи

        if( $reg ){
            $reg->bindParam(':u_mail', $username,PDO::PARAM_STR);
            $reg->bindParam(':u_mail', $email,PDO::PARAM_STR);
            $reg->bindParam(':u_add', $address,PDO::PARAM_STR);
            $reg->bindParam(':u_pass', $pass,PDO::PARAM_STR);
            $reg->execute();
            return true;            
        } else {
            exit('error');
        }

У вас также есть неправильно названный параметр в первом операторе связывания

$reg->bindParam(':u_mail', $username,PDO::PARAM_STR);

должно быть

$reg->bindParam(':u_name', $username,PDO::PARAM_STR);

Вы Я могу использовать блок try/catch, чтобы попытаться идентифицировать проблемы конструктивным образом, как этот

public function reg_user($username, $email, $address, $pwd){
    try{
        $pass = password_hash($pwd, PASSWORD_BCRYPT);
        $check = $this->db->prepare('SELECT * FROM `bakery_users` WHERE `u_mail` = :u_mail');
        if( !$check )throw new Exception('Failed to prepare SELECT query');

        $check->bindParam(':u_mail', $email, PDO::PARAM_STR);
        $check->execute();
        $count = $check->rowCount();

        if( $count < 0 ){

            $reg = $db->prepare('INSERT INTO `bakery_users` (`u_name`, `u_mail`, `u_add`, `u_pass` ) VALUES ( :u_name, :u_mail, :u_add, :u_pass )');

            if( $reg ){
                $reg->bindParam(':u_name', $username,PDO::PARAM_STR);
                $reg->bindParam(':u_mail', $email,PDO::PARAM_STR);
                $reg->bindParam(':u_add', $address,PDO::PARAM_STR);
                $reg->bindParam(':u_pass', $pass,PDO::PARAM_STR);
                $reg->execute();

                return true;            
            } else {
                throw new Exception('Failed to prepare INSERT query')
            }
        } else{
           $db = null;
           return false;
        }
    }catch( Exception $e ){
        exit( sprintf('An error "%s" on line %d of "%s"',$e->getMessage(),$e->getLine(),__METHOD__ ) );
    }
}

Я должен был заметить раньше, чем использовать if( $count < 0 ) ~, что должно быть if( $count==0 )

[115 ]
17
задан drizzle 8 May 2009 в 22:54
поделиться

4 ответа

«rake db: migrate» попытается запустить все незавершенные миграции для вашего проекта. Если вы просто хотите сбросить схему, выполните команду rake db: schema: dump.
Но я думаю, у вас проблема, когда говорится, что таблица уже существует. Одна из ваших миграций не удалась, потому что таблица, которую он пытается добавить, уже существует в вашей базе данных. Вы создали его вручную? Вы выполнили миграцию, но не записали ее? Вам нужно будет исправить это, прежде чем вы сможете писать будущие миграции. Если это просто ошибка, а таблица есть и исправьте, и вы хотите проигнорировать это. Я рекомендую обойти это, закомментировав таблицу создания в неудачной миграции. Затем запустите rake db: migrate. Затем создайте таблицу обратно. Это обновит вашу версию схемы.
Убедитесь, что вы указали правильные отключения для всех миграций.

19
ответ дан 30 November 2019 в 10:14
поделиться

Try rake db:schema:dump or rake db:migrate:redo.

2
ответ дан 30 November 2019 в 10:14
поделиться

отвечая на ваш последний вопрос относительно документации:

1
ответ дан 30 November 2019 в 10:14
поделиться

Я обнаружил, что иногда, когда все становится немного странно, вы попадаете в ситуацию, когда Rails захочет выполнить миграцию, которую по праву следует считать уже выполненной ( таблица уже существует и т. д.). Вы можете пометить миграцию как выполненную, найдя ее номер (числовую часть в начале имени файла), войдя в mysql и выполнив такой запрос:

insert into schema_migrations values('20090521153438');

(или любой другой номер вашей миграции)

Или если миграция плагина выполняется с использованием migrate_plugin Desert:

insert into plugin_schema_migrations values('my_plugin', '005');
15
ответ дан 30 November 2019 в 10:14
поделиться
Другие вопросы по тегам:

Похожие вопросы: