db.create_all()不会创建在单独文件中定义的表

use*_*629 5 python sqlalchemy flask flask-sqlalchemy

我正在尝试为我的模型创建表格,这些表格在我的应用程序的单独模块中定义.我打电话db.create_all(),但没有创建表,也没有错误.我已经定义了模型并在调用之前导入了它们create_all.为什么这不起作用?

from flask import Flask
from flask.ext.sqlalchemy import SQLAlchemy

app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'postgresql+psycopg2://postgres:123@localhost/flask'
db = SQLAlchemy(app)

from models import User

db.create_all()
db.session.commit()
Run Code Online (Sandbox Code Playgroud)

models.py:

from flask.ext.sqlalchemy import SQLAlchemy

db = SQLAlchemy()

class User(db.Model):
  __tablename__ = 'users'
  uid = db.Column(db.Integer, primary_key = True)
Run Code Online (Sandbox Code Playgroud)

dav*_*ism 11

您创建了两个单独的数据库实例,一个与应用程序一起创建,另一个与模型一起创建.每个实例都有自己的元数据,用于存储在其上定义的表.您用于发出create table语句的那个​​不是定义模型的那个.您应该只使用扩展的一个实例,并在需要时导入它.

myapp/__init__.py:

from flask import Flask
from flask_sqlalchemy import SQLAlchemy

app = Flask(__name__)
db = SQLAlchemy(app)

# import the models *after* the db object is defined
from myapp import models
Run Code Online (Sandbox Code Playgroud)

myapp/models.py:

from myapp import db

class User(db.Model):
    ...
Run Code Online (Sandbox Code Playgroud)

create_tables.py:

from myapp import app, db

with app.app_context():
    db.create_all()
Run Code Online (Sandbox Code Playgroud)

其他注意事项:

  • 您应该将应用程序构建为一个包,以便一切都可以在一个位置下导入.
  • flask.ext 不推荐使用,直接从其包名称导入扩展名.
  • Flask-SQLAlchemy自动__tablename__从类名生成,您不需要自己定义它.
  • 你不必调用commitcreate_all.