Flask-SQLAlchemy没有使用create_all()创建表

Chr*_*nel 4 python flask flask-sqlalchemy

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

我正在使用这两个__tablename____bind_key__我的模型,因为我有两个数据库.

我的配置:

SQLALCHEMY_DATABASE_URI = 'sqlite://'

SQLALCHEMY_BINDS = {
    'db1': SQLALCHEMY_DATABASE_URI,
    'db2': SQLALCHEMY_DATABASE_URI
}
Run Code Online (Sandbox Code Playgroud)

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

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

class APITestCase(unittest.TestCase):

    app = Flask(__name__)
    db = SQLAlchemy(app)
    db.create_all()
Run Code Online (Sandbox Code Playgroud)

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

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
        ...
Run Code Online (Sandbox Code Playgroud)

我错过了一些明显的东西吗?Flask-SQLAlchemy如何知道在哪里查找我的模型来创建关联表?

Daz*_*all 12

在单元测试中,你不应该创建SQLAlchemy的对象("DB"),你应该导入从您的模型下降的情况下的一个新的实例:

models.py:

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

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

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()
Run Code Online (Sandbox Code Playgroud)