FLASK SQLALCHEMY create_all() 不工作

Posted

技术标签:

【中文标题】FLASK SQLALCHEMY create_all() 不工作【英文标题】:FLASK SQLALCHEMY create_all() not working 【发布时间】:2022-01-14 18:28:16 【问题描述】:

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

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()?你必须明确地这样做。 在create_app()方法内部,调用了db.create_db() 当我运行烧瓶时,我会这样做:export FLASK_APP='safecanyons:app' 所以我认为 create_app() 会被调用。同样在您发表评论后,我尝试在烧瓶运行引发后手动调用,但仍然无法正常工作(未创建模型) 您确定在 create_all() 之前导入了用户模型定义。因为你有导入但也有注释代码。你可以尝试把用户 【参考方案1】:

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

    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>"
    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 调用之前定义。

类似主题:

db.create_all() not creating tables in Flask-SQLAclchemy SQLAlchemy create_all() does not create tables

【讨论】:

以上是关于FLASK SQLALCHEMY create_all() 不工作的主要内容,如果未能解决你的问题,请参考以下文章

flask-sqlalchemy

PyCharm 解析 - flask.ext.sqlalchemy 与 flask_sqlalchemy

Python flask-sqlalchemy初级解析

flask-sqlalchemy

Flask-SQLAlchemy 和 SQLAlchemy

Flask-SQLAlchemy使用方法