FLASK SQLALCHEMY create_all()无效

3

我知道这是一个典型的问题,但我做错了什么?
设置后

FLASK_APP='safecanyons:app'
flask run

应用程序已启动,但没有创建任何数据表。以下是主要脚本:
from flask import Flask, request, jsonify, g
from flask_sqlalchemy import SQLAlchemy
from flask_jwt_extended import JWTManager, jwt_required
from safecanyons.models.users import User
from safecanyons.v1.users import bp as bp_users
from safecanyons.settings.dev import SQLALCHEMY_DATABASE_URI
from psycopg2 import connect
from flask_sqlalchemy import SQLAlchemy
from safecanyons.models.users import User

def create_app():
    # The imports :
    # from safecanyons.settings.dev import SQLALCHEMY_DATABASE_URI
    
    # SQLALCHEMY_DATABASE_URI = "postgresql://{}:{}@{}/{}".format(
    # DB_USER, DB_PASSWORD, DB_HOST,DB_NAME
    # ) 
    # 
    # from safecanyons.models.users import User
    # 
    # from flask_sqlalchemy import SQLAlchemy
    # db = SQLAlchemy()

    # class User(db.Model):
    # __tablename__ = 'users'
    
    # id = db.Column(db.Integer, primary_key=True)
    # username = db.Column(db.String(80), unique=True, nullable=False)
    # email = db.Column(db.String(120), unique=True, nullable=False)

    # def __repr__(self):
    #     return '<User %r>' % self.username
      
    uri = SQLALCHEMY_DATABASE_URI
    app = Flask('safecanyons')
    app.config['SQLALCHEMY_DATABASE_URI'] = uri
    SQLALCHEMY_TRACK_MODIFICATIONS = True
    db = SQLAlchemy(app)
    from safecanyons.models.users import User

    db.create_all()
  
    jwt = JWTManager(app)
    app.register_blueprint(bp_users,url_prefix='/v1/users')
    return app,db

app,db = create_app()


@app.route("/")
def hello_world():
    return "<p>Hello, World!</p>"

我尝试使用app.app_context(),但它不像我预期的那样工作。当我到数据库查看用户表创建时,没有任何表存在。


但是当你执行 db.create_all() 时呢?你必须明确地执行它。 - jorzel
在 create_app() 方法内,调用了 db.create_db()。 - Javier
当我运行 Flask 时,我执行以下操作:export FLASK_APP='safecanyons:app',因此我认为 create_app() 接着被调用。另外,在您的评论之后,我尝试在 flask run 被调用后手动调用,但仍然无法正常工作(未创建模型)。 - Javier
你确定在create_all()之前已经导入了User模型定义吗?因为你不仅导入了,还注释掉了一些代码。你可以尝试将User模型的导入语句放在create_all()之前。 - jorzel
1个回答

2

您可能在正确导入User模型方面遇到了问题(因为使用create_app模式时存在循环导入挑战,并且您正在使用奇怪的hack,通过从create_app返回db)。 在调用create_all之前必须定义User,但是需要定义db,而create_all也需要。 如何解决它(文件名和项目结构可能有误):

  1. safecanyons/app.py
from flask_jwt_extended import JWTManager, jwt_required
from flask_sqlalchemy import SQLAlchemy
from psycopg2 import connect

from safecanyons.v1.users import bp as bp_users
from safecanyons.settings.dev import SQLALCHEMY_DATABASE_URI


db = SQLAlchemy()

def create_app():
    from safecanyons.models.users import User
 
    uri = SQLALCHEMY_DATABASE_URI
    app = Flask('safecanyons')
    app.config['SQLALCHEMY_DATABASE_URI'] = uri
    SQLALCHEMY_TRACK_MODIFICATIONS = True

    db.init_app(app) # init of db is deferred
    db.create_all()

    jwt = JWTManager(app)
    app.register_blueprint(bp_users,url_prefix='/v1/users')
    return app
   
app = create_app()

@app.route("/")
def hello_world():
    return "<p>Hello, World!</p>"
  1. safecanyons/models/users.py:
from safecayons.app import db

class User(db.Model):
    __tablename__ = 'users'
    
    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(80), unique=True, nullable=False)
    email = db.Column(db.String(120), unique=True, nullable=False)

    def __repr__(self):
        return '<User %r>' % self.username

另一个解决方案是将上述代码放置在一个文件中,但是模型“User”应该在“create_all”调用之前定义。
类似的主题:

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接