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

天涯浪子 提交于 2020-07-19 05:28:47

问题


I am trying to create a database table for a user class model using Flask-SQLAclchemy and Postgres.

My model class.

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))

My app initialisation.

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)

The following info is logged.

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 {}

回答1:


If you were following the flask quick start minimal application, the command worked by default since the User class was in the same place as the db instance. In your case, however, you will have to import the User class as mentioned in the comments from models import User into your app initialization




回答2:


As someone in the comments mentioned you are not importing your model into your app initialisation module. You could do that as follows

from models import User




回答3:


As per previous comments, besides importing the db sqlalchemy object, you have to import manually your model like so

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

it's not that bad for small app with couple models to import, but it will be really tedious when it comes to work with medium / large app with many blueprints each one has its own models, so you have to import all of them manually so you can imagine the amount of typing code in the shell without talking about errors (typos, import modules errors ..), the solution is to use Shell Context to load automatically all objects:

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 }

now in your shell you can manipulate all objects without any hassle

(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()


来源:https://stackoverflow.com/questions/48125990/db-create-all-not-creating-tables-in-flask-sqlaclchemy

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!