Flask-SQLAlchemy未通过create_all()创建表

5 投票
2 回答
8393 浏览
提问于 2025-04-17 17:03

我有一个使用 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 是怎么知道去哪里找我的模型以创建相关的表的呢?

2 个回答

-2

你的 SQLALCHEMY_DATABASE_URI 配置错了,想了解怎么设置 Sqlite 数据库的引擎,可以看看这里的说明 http://docs.sqlalchemy.org/en/rel_0_9/core/engines.html#sqlite

如果你之前没有接触过,可以看看这个代码库,然后把它应用到你的项目中哦 :) https://github.com/Fird0s/Banda-Maps/blob/master/models.py

13

在你的单元测试中,不应该新建一个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()

撰写回答