【问题标题】:db.create_all() doesn't create tables defined in separate filedb.create_all() 不会创建在单独文件中定义的表
【发布时间】:2016-05-06 02:10:30
【问题描述】:

我正在尝试为我的模型创建表,这些表是在我的应用程序的单独模块中定义的。我打电话给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)

【问题讨论】:

    标签: python flask sqlalchemy flask-sqlalchemy


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-06-15
      • 1970-01-01
      • 1970-01-01
      • 2020-09-10
      • 2017-12-04
      • 1970-01-01
      • 2022-10-25
      • 2017-07-25
      相关资源
      最近更新 更多