【问题标题】:Flask-SQLAlchemy not creating tables using create_all()Flask-SQLAlchemy 不使用 create_all() 创建表
【发布时间】:2013-02-25 14:14:27
【问题描述】:

我有一个使用 Flask-SQLAlchemy 的 Flask 应用程序。在我的单元测试中,我初始化了应用程序和数据库,然后调用了db.create_all(),由于某种原因,它看起来没有拾取我的任何模型,因此没有创建任何表。

我在我的模型中同时使用__tablename____bind_key__,因为我有两个数据库。

我的配置:

SQLALCHEMY_DATABASE_URI = 'sqlite://'

SQLALCHEMY_BINDS = {
    'db1': SQLALCHEMY_DATABASE_URI,
    'db2': SQLALCHEMY_DATABASE_URI
}

在我的单元测试中减少我的 setUp() 方法的版本:

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

class APITestCase(unittest.TestCase):

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

这是我的两个模型的示例,每个绑定类型一个:

class Contact(db.Model):

    __tablename__ = 'contact'
    __bind_key__ = 'db1'

    id = db.Column(db.Integer, primary_key=True)
    first_name = db.Column(db.String(255))
    last_name = db.Column(db.String(255))
    ...

    def __init__(first_name, last_name):
        self.first_name = first_name
        self.last_name = last_name
        ...

class BaseUser(db.Model):

    __tablename__ = 'User__GeneralUser'
    __bind_key__ = 'db2'

    id = db.Column(db.Integer, primary_key=True)
    username = db.Column('Username', db.String(100))
    first_name = db.Column('FirstName', db.String(100))
    last_name = db.Column('Surname', db.String(100))
    ...

    def __init__(username, first_name, last_name):
        self.username = username
        self.first_name = first_name
        self.last_name = last_name
        ...

我是否遗漏了一些显而易见的事情? Flask-SQLAlchemy 如何知道在哪里查找我的模型以创建关联表?

【问题讨论】:

  • 你导入你的模型类了吗?
  • 是的,我尝试过导入和不导入模型。

标签: python flask flask-sqlalchemy


【解决方案1】:

在您的单元测试中,您不应创建 SQLAlchemy 对象 ('db') 的新实例,而应导入模型从其下降的实例:

models.py:

from flask.ext.sqlalchemy import SQLAlchemy
db = SQLAlchemy()

class Contact(db.Model):
    ...

tests.py:

from models import db
from flask import Flask
import unittest

class TestExample(unittest.TestCase):

    def setUp(self):
        self.app = Flask(__name__)
        db.init_app(self.app)
        with self.app.app_context():
            db.create_all()

【讨论】:

  • 如果所有模型声明在多个模块中实现,有哪些好的方法可以确保它们被执行?
【解决方案2】:

您的 SQLALCHEMY_DATABASE_URI 错误,请阅读此处如何配置您的引擎 Sqlite 数据库http://docs.sqlalchemy.org/en/rel_0_9/core/engines.html#sqlite

如果您从未体验过,请查看此 repo 并应用于您的应用 :) https://github.com/Fird0s/Banda-Maps/blob/master/models.py

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-03-29
    • 2014-01-11
    • 1970-01-01
    • 2015-06-02
    • 2022-01-14
    • 1970-01-01
    • 1970-01-01
    • 2015-09-13
    相关资源
    最近更新 更多