如果使用 Marshmallow,SQLAlchemy 不会创建表
SQLAlchemy don't create tables if using Marshmallow
我正在尝试使用 Flask
、Flask-SQLAlchemy
、flask-restplus
和 marshmallow
创建项目(也尝试使用 flask-marshmallow
),但是这些工具的集成效果不是很好。
每次我包含一些新的库时,都会发生新的错误。
我已经放弃将 migrations
与 Flask-SQLAlchemy
一起使用,因为出于某种原因,这个东西不起作用。但是现在,问题出在 marshmallow
.
我正在尝试使用模块,我认为这是问题的一部分(Flask-SQLAlchmey、flask-restplus、flask-marshmallow 等的所有示例都将所有内容放在一个文件中)
这是我的app.py:
from flask import Flask, Blueprint
import settings
from api import api
from database import init_database, reset_database
app = Flask(__name__)
def configure_app(flask_app):
flask_app.config['SERVER_NAME'] = settings.SERVER_ADDRESS
flask_app.secret_key = settings.SECRET_KEY
def initialize_app(flask_app):
configure_app(flask_app)
blueprint = Blueprint('api', __name__, url_prefix=settings.URL_PREFIX)
api.init_app(blueprint)
# api.add_namespace(auth_login_namespace)
flask_app.register_blueprint(blueprint)
init_database(flask_app)
if settings.DEBUG:
reset_database(flask_app)
def main():
initialize_app(app)
app.run(debug=settings.DEBUG)
if __name__ == '__main__':
main()
api/__init__.py
:
import settings
from flask_restplus import Api
api = Api(
version='1.0',
title='Test',
description='Some description'
)
@api.errorhandler
def default_error_handler(e):
message = 'An unhandled exception occurred.'
if not settings.DEBUG:
return {'message': message}, 500
database/__init__.py
:
from flask_sqlalchemy import SQLAlchemy
import settings
db = SQLAlchemy()
def init_database(flask_app):
flask_app.config['SQLALCHEMY_DATABASE_URI'] = settings.DATABASE_URI
flask_app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
global db # I really don't like this! :(
db = SQLAlchemy(flask_app)
def reset_database(flask_app):
from database.models import User
db.drop_all()
db.create_all()
db.session.add(User(username='admin', email='abc@def.com', name='admin', password='123', admin=True)
db.session.commit()
我有我的应用程序,到目前为止只有一个 model
:
database/models/User.py
:
from marshmallow import Schema, fields
from sqlalchemy import func
from database import db
class User(db.Model):
id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String(80), unique=True, index=True)
email = db.Column(db.String(120), unique=True, index=True)
name = db.Column(db.String(200), nullable=False)
password = db.Column(db.String(200), nullable=False)
admin = db.Column(db.Boolean, nullable=False, default=False)
created_on = db.Column(db.DateTime, nullable=False, server_default=func.now())
class UserSchema(Schema):
id = fields.Int(dump_only=True)
username = fields.Str()
email = fields.Email()
name = fields.Str()
password = fields.Str()
admin = fields.Bool()
created_on = fields.DateTime()
现在,如果我使用以下代码(每次我的应用程序以调试模式启动时都会调用此代码,函数 reset_database
,在文件 database/__init__.py):
db.drop_all()
db.create_all()
db.session.add(User(username='admin', email='abc@def.com', name='admin', password='123', admin=True)
db.session.commit()
User
table 未创建,并且 admin
未插入 table,因为 table 不存在 (db.create_all()
不要创建任何东西)。
sqlite3.OperationalError: no such table: user
.
出于某种原因,如果我删除 class UserSchema
(在 database/models/User.py),db.create_all()
函数创建 table).
现在开始工作:
在 database/__init__.py
上,将 init_database
函数更改为:
def init_database(flask_app):
flask_app.config['SQLALCHEMY_DATABASE_URI'] = settings.DATABASE_URI
flask_app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
db.init_app(flask_app)
并在 database/reset_database.py
中:
def reset_database(flask_app):
with flask_app.app_context():
from database.models.user_module import User
db.drop_all()
db.create_all()
db.session.add(User(username='admin', email='abc@def.com', name='admin', password='123', admin=True))
db.session.commit()
问题是 init_app
,使用 app_context
,我导入了错误的 User
模块 (tks Fian)
我正在尝试使用 Flask
、Flask-SQLAlchemy
、flask-restplus
和 marshmallow
创建项目(也尝试使用 flask-marshmallow
),但是这些工具的集成效果不是很好。
每次我包含一些新的库时,都会发生新的错误。
我已经放弃将 migrations
与 Flask-SQLAlchemy
一起使用,因为出于某种原因,这个东西不起作用。但是现在,问题出在 marshmallow
.
我正在尝试使用模块,我认为这是问题的一部分(Flask-SQLAlchmey、flask-restplus、flask-marshmallow 等的所有示例都将所有内容放在一个文件中)
这是我的app.py:
from flask import Flask, Blueprint
import settings
from api import api
from database import init_database, reset_database
app = Flask(__name__)
def configure_app(flask_app):
flask_app.config['SERVER_NAME'] = settings.SERVER_ADDRESS
flask_app.secret_key = settings.SECRET_KEY
def initialize_app(flask_app):
configure_app(flask_app)
blueprint = Blueprint('api', __name__, url_prefix=settings.URL_PREFIX)
api.init_app(blueprint)
# api.add_namespace(auth_login_namespace)
flask_app.register_blueprint(blueprint)
init_database(flask_app)
if settings.DEBUG:
reset_database(flask_app)
def main():
initialize_app(app)
app.run(debug=settings.DEBUG)
if __name__ == '__main__':
main()
api/__init__.py
:
import settings
from flask_restplus import Api
api = Api(
version='1.0',
title='Test',
description='Some description'
)
@api.errorhandler
def default_error_handler(e):
message = 'An unhandled exception occurred.'
if not settings.DEBUG:
return {'message': message}, 500
database/__init__.py
:
from flask_sqlalchemy import SQLAlchemy
import settings
db = SQLAlchemy()
def init_database(flask_app):
flask_app.config['SQLALCHEMY_DATABASE_URI'] = settings.DATABASE_URI
flask_app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
global db # I really don't like this! :(
db = SQLAlchemy(flask_app)
def reset_database(flask_app):
from database.models import User
db.drop_all()
db.create_all()
db.session.add(User(username='admin', email='abc@def.com', name='admin', password='123', admin=True)
db.session.commit()
我有我的应用程序,到目前为止只有一个 model
:
database/models/User.py
:
from marshmallow import Schema, fields
from sqlalchemy import func
from database import db
class User(db.Model):
id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String(80), unique=True, index=True)
email = db.Column(db.String(120), unique=True, index=True)
name = db.Column(db.String(200), nullable=False)
password = db.Column(db.String(200), nullable=False)
admin = db.Column(db.Boolean, nullable=False, default=False)
created_on = db.Column(db.DateTime, nullable=False, server_default=func.now())
class UserSchema(Schema):
id = fields.Int(dump_only=True)
username = fields.Str()
email = fields.Email()
name = fields.Str()
password = fields.Str()
admin = fields.Bool()
created_on = fields.DateTime()
现在,如果我使用以下代码(每次我的应用程序以调试模式启动时都会调用此代码,函数 reset_database
,在文件 database/__init__.py):
db.drop_all()
db.create_all()
db.session.add(User(username='admin', email='abc@def.com', name='admin', password='123', admin=True)
db.session.commit()
User
table 未创建,并且 admin
未插入 table,因为 table 不存在 (db.create_all()
不要创建任何东西)。
sqlite3.OperationalError: no such table: user
.
出于某种原因,如果我删除 class UserSchema
(在 database/models/User.py),db.create_all()
函数创建 table).
现在开始工作:
在 database/__init__.py
上,将 init_database
函数更改为:
def init_database(flask_app):
flask_app.config['SQLALCHEMY_DATABASE_URI'] = settings.DATABASE_URI
flask_app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
db.init_app(flask_app)
并在 database/reset_database.py
中:
def reset_database(flask_app):
with flask_app.app_context():
from database.models.user_module import User
db.drop_all()
db.create_all()
db.session.add(User(username='admin', email='abc@def.com', name='admin', password='123', admin=True))
db.session.commit()
问题是 init_app
,使用 app_context
,我导入了错误的 User
模块 (tks Fian)