db.create_all()不创建在单独文件中定义的表 [英] db.create_all() doesn't create tables defined in separate file

查看:23
本文介绍了db.create_all()不创建在单独文件中定义的表的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试为我的模型创建表,这些表是在与我的应用程序不同的模块中定义的。我调用db.create_all(),但没有创建表,也没有错误。我已经定义了模型和imported them before calling 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()

models.py

from flask.ext.sqlalchemy import SQLAlchemy

db = SQLAlchemy()

class User(db.Model):
  __tablename__ = 'users'
  uid = db.Column(db.Integer, primary_key = True)

推荐答案

您创建了两个单独的数据库实例,一个与应用程序一起创建,另一个与模型一起创建。每个实例都有自己的元数据,用于存储在其上定义的表。您用来发出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

myapp/models.py

from myapp import db

class User(db.Model):
    ...

create_tables.py

from myapp import app, db

with app.app_context():
    db.create_all()

其他注意事项:

  • 您应该将您的应用程序组织为包,以便所有内容都可以导入到一个位置。
  • flask.ext已弃用,请直接从其包名导入扩展。
  • Flask-SQLAlChemy自动从类名生成__tablename__,您不需要自己定义它。
  • create_all之后无需调用commit

这篇关于db.create_all()不创建在单独文件中定义的表的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆