0

でフラスコを使用していpython3ます。

移行スクリプトはエラーなしで動作しています。メインアプリも問題なく動いています。postgresql移行を実行するときに使用していますが、すべて正常に実行されますが、postgresシェルに移動すると、作成されているテーブルが表示されません。

model.py

from imports import db
from datetime import datetime
from sqlalchemy import ForeignKey
from sqlalchemy.orm import relationship

class UserInfo(db.Model):

    __tablename_ = 'user_info'

    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(80), unique=True)
    email = db.Column(db.String(80), unique=True)
    password = db.Column(db.String(100), nullable=False)
    posts = relationship('UserPosts', backref='posts')

    def __init__(self, username, email, password):
        self.username = username
        self.email = email
        self.password = password

    def __repr__(self):
            return '{}-{}'.format(self.username, self.email)

ご覧のとおり、そこには2つのテーブルがありuser_infoますが、手動で作成したためデータベースに表示されていますが、他のテーブルは表示されていません。

export DATABASE_URL="postgresql:user:password@localhost/registration"

tail /var/log/apache2/error.log
[Fri Oct 07 17:21:56.049888 2016] [wsgi:error] [pid 19131:tid 140331236435712] [client 174.58.31.189:34358]   File "/usr/local/lib/python3.5/dist-packages/sqlalchemy/util/compat.py", line 185, in reraise, referer: http://localhost/login/
[Fri Oct 07 17:21:56.049900 2016] [wsgi:error] [pid 19131:tid 140331236435712] [client 174.58.31.189:34358]     raise value.with_traceback(tb), referer: http://localhost/login/
[Fri Oct 07 17:21:56.049919 2016] [wsgi:error] [pid 19131:tid 140331236435712] [client 174.58.31.189:34358]   File "/usr/local/lib/python3.5/dist-packages/sqlalchemy/engine/base.py", line 1139, in _execute_context, referer: http://localhost/login/
[Fri Oct 07 17:21:56.049931 2016] [wsgi:error] [pid 19131:tid 140331236435712] [client 174.58.31.189:34358]     context), referer: http://localhost/login/
[Fri Oct 07 17:21:56.049951 2016] [wsgi:error] [pid 19131:tid 140331236435712] [client 174.58.31.189:34358]   File "/usr/local/lib/python3.5/dist-packages/sqlalchemy/engine/default.py", line 450, in do_execute, referer: http://localhost/login/
[Fri Oct 07 17:21:56.049962 2016] [wsgi:error] [pid 19131:tid 140331236435712] [client 174.58.31.189:34358]     cursor.execute(statement, parameters), referer: http://localhost/login/
[Fri Oct 07 17:21:56.050034 2016] [wsgi:error] [pid 19131:tid 140331236435712] [client 174.58.31.189:34358] sqlalchemy.exc.ProgrammingError: (psycopg2.ProgrammingError) column user_info.password does not exist, referer: http://localhost/login/
[Fri Oct 07 17:21:56.050088 2016] [wsgi:error] [pid 19131:tid 140331236435712] [client 174.58.31.189:34358] LINE 1: ...nfo_username, user_info.email AS user_info_email, user_info...., referer: http://localhost/login/
[Fri Oct 07 17:21:56.050106 2016] [wsgi:error] [pid 19131:tid 140331236435712] [client 174.58.31.189:34358]                                                              ^, referer: http://localhost/login/
[Fri Oct 07 17:21:56.050122 2016] [wsgi:error] [pid 19131:tid 140331236435712] [client 174.58.31.189:34358]  [SQL: 'SELECT user_info.id AS user_info_id, user_info.username AS user_info_username, user_info.email AS user_info_email, user_info.password AS user_info_password \\nFROM user_info'], referer: http://localhost/login/

データベースへの接続を正しい方法で設定しているかどうか、または何も作成されていないかどうかはわかりません。

ありがとう。

from flask_script import Manager
from flask_migrate import Migrate, MigrateCommand
import os

import __init__

__init__.app.config.from_object(os.environ['APP_SETTINGS'])
migrate = Migrate(__init__.app, __init__.db)
manager = Manager(__init__.app)

manager.add_command('db', MigrateCommand)

if __name__ == '__main__':
    manager.run()
4

1 に答える 1

0

存在するはずのテーブルが 2 つあるとおっしゃいましたが、models.pyファイルで定義されているのは 1 つだけですUserInfoUserPostsファイルの他の場所でも定義していますか、それとも関係を作成しただけですか? そうでない場合は、そのモデルも作成する必要があります。

指摘すべきもう 1 つの点は、ForeignKeyandrelationshipをインポートする代わりに、 andsqlalchemyを使用する必要があることです。db.relationship()db.ForeignKey()

また、URL に数文字が欠けていることもわかります。あなたのURLの代わりに次の"postgresql:user:password@localhost/registration"ようになります"postgresql://user:password@localhost/registration"

最後に、ファイルを使用して移行およびアップグレードしますmanage.pyか、それとも移行のみを行いますか? 実行した後python manage.py db migrateは、python manage.py db upgrade. migrateコマンドは移行スクリプトを作成しますが、コマンドupgradeはそれを実行し、変更をデータベースに書き込みます。

最後に注意すべきことはuser_info、サーバーにログインしている間にモデルを変更して移行を実行すると、セッションに保存されているものとデータベースにあるものの間に不一致が生じる場合があることです。これにより、wsgi から投稿したエラーと同様にアプリがクラッシュする可能性があり、ここでも発生した可能性があると思います。データベースをいじる前に必ずログアウトしてください。ただし、ログアウトした場合は、Cookie をクリアしてセッションを削除し、エラーを解消できるはずです。

于 2016-11-30T21:39:06.160 に答える