【问题标题】:SQLAlchemy don't create tables if using Marshmallow如果使用 Marshmallow,SQLAlchemy 不会创建表
【发布时间】:2017-06-12 17:42:39
【问题描述】:

我正在尝试使用FlaskFlask-SQLAlchemyflask-restplusmarshmallow(也尝试使用flask-marshmallow)创建一个项目,但是这些工具的集成效果不佳。 每次我包含一些新库时,都会出现一个新错误。

我已经放弃将migrationsFlask-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 表未创建,admin 未插入表中,因为该表不存在(db.create_all() 不创建任何内容)。

sqlite3.OperationalError: no such table: user.

出于某种原因,如果我删除了 UserSchema 类(在 database/models/User.py 上),db.create_all() 函数会创建表。

【问题讨论】:

  • 请将您的 app.py 添加到您的问题中,并将导入命令添加到您的示例中,我想我有一个解决方案。
  • @Fian,我已经用导入和 app.py 更新了这个问题。问题变得更长了,但我想我把你需要的一切都放了!
  • 你确定你有模块database/models/User.py而不是database/models.py
  • @Fian,是的,绝对确定!在database 文件夹中,我有一个__init__.py 上面的代码,在这个文件夹中,我有另一个名为models 的文件夹。在这个models 文件夹中,我有一个带有空白内容的__init.py__,还有一个带有上面代码的User.py。在reset_database 函数中,尝试将import 更改为from database.models.User import User 并得到同样的错误。
  • 您可以尝试将文件名从User.py 更改为user_module.py 并将from database.models import User 行更改为from database.models.user_module import User 并再次测试吗?错误是否仍然存在?

标签: python flask flask-sqlalchemy marshmallow flask-restplus


【解决方案1】:

马上开始工作:

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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-06-04
    • 2016-01-07
    • 2023-02-02
    • 2023-02-06
    • 2014-01-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多