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() 不工作的主要内容,如果未能解决你的问题,请参考以下文章