【问题标题】:db.create_all() not creating tables in Flask-SQLAclchemydb.create_all() 不在 Flask-SQLAlchemy 中创建表
【发布时间】:2018-06-15 23:55:57
【问题描述】:

我正在尝试使用Flask-SQLAclchemyPostgres 为用户类模型创建数据库表。

我的模型课。

from app import db
class User(db.Model):
    __tablename__ = 'users'
    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(70), index=True, nullable=False)
    email = db.Column(db.String(70), index=True, unique=True, nullable=False)
    password = db.Column(db.String(128))

我的应用初始化。

from flask import Flask
from flask_sqlalchemy import SQLAlchemy
app = Flask(__name__)
app.config.from_object('app.instance.config.DevelopmentConfig')
app.config['SQLALCHEMY_DATABASE_URI'] = 'postgresql://postgres:RandomPass@localhost/BrightEventDb'
SQLALCHEMY_TRACK_MODIFICATIONS = True
db = SQLAlchemy(app)

记录了以下信息。

2018-01-06 11:53:09,978 INFO sqlalchemy.engine.base.Engine select version()
2018-01-06 11:53:09,979 INFO sqlalchemy.engine.base.Engine {}
2018-01-06 11:53:09,982 INFO sqlalchemy.engine.base.Engine select current_schema()
2018-01-06 11:53:09,982 INFO sqlalchemy.engine.base.Engine {}
2018-01-06 11:53:09,984 INFO sqlalchemy.engine.base.Engine SELECT CAST('test plain returns' AS VARCHAR(60)) AS anon_1
2018-01-06 11:53:09,985 INFO sqlalchemy.engine.base.Engine {}
2018-01-06 11:53:09,986 INFO sqlalchemy.engine.base.Engine SELECT CAST('test unicode returns' AS VARCHAR(60)) AS anon_1
2018-01-06 11:53:09,987 INFO sqlalchemy.engine.base.Engine {}
2018-01-06 11:53:09,990 INFO sqlalchemy.engine.base.Engine show standard_conforming_strings
2018-01-06 11:53:09,991 INFO sqlalchemy.engine.base.Engine {}

【问题讨论】:

    标签: python python-3.x python-2.7 flask flask-sqlalchemy


    【解决方案1】:

    如果您正在关注烧瓶快速启动最小应用程序,则该命令默认工作,因为 User 类与 db 实例位于同一位置。但是,在您的情况下,您必须将 cmets from models import User 中提到的 User 类导入您的应用初始化

    【讨论】:

    【解决方案2】:

    正如 cmets 中的某个人所说,您没有将模型导入您的应用初始化模块。你可以这样做

    from models import User

    【讨论】:

      【解决方案3】:

      根据之前的 cmets,除了导入 db sqlalchemy 对象外,您还必须像这样手动导入您的模型

      (venv) $ py -m flask shell
      >>> from app import db
      >>> from app.models import User
      >>> db.create_all()
      

      导入几个模型的小型应用程序并没有那么糟糕,但是当涉及到具有许多蓝图的中/大型应用程序时,它会非常乏味,每个模型都有自己的模型,所以你必须导入所有它们manually 所以你可以想象在shell中输入代码的数量而不谈论错误(打字错误,导入模块错误..),解决方案是使用Shell Context加载automatically所有对象:

      from app import app, db
      from app.models import User, Post, Category
      
      @app.shell_context_processor
      def make_shell_context():
          return {'db': db, 'User': User, 'Post': Post, 'Category': Category }
      

      现在您可以在您的 shell 中轻松操作所有对象

      (venv) $ py -m flask shell
      >>> db
      <SQLAlchemy engine=sqlite:///data-dev.sqlite>
      >>> User
      <class 'app.models.User'>
      >>> Post
      <class 'app.models.Post'>
      >>> db.create_all()
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-03-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-06-16
        相关资源
        最近更新 更多