【发布时间】:2021-09-30 00:32:04
【问题描述】:
我想在运行 pytest 时利用 SQLAlchemy 的 create_all 的强大功能。
我目前的问题是我使用单独的数据库进行测试和开发,因此我使用了两个 SQLAlchemy 实例。是否可以让一个 SQLAlchemy 实例指向多个数据库?
目前,在我的test_db 中,我可以单独调用各个模型来创建它们的关联表,例如:
MagicToken.__table__.create(tdb.engine)
MagicToken.__table__.drop(tdb.engine)
一切都是绿色的。但是,此解决方案不能很好地扩展。
任何想法如何进行?
app.py
app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = db_string()
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
db = SQLAlchemy(app)
MagicToken.py
from app import db
from datetime import datetime
class MagicToken(db.Model):
id = db.Column(db.Integer, primary_key=True)
email = db.Column(db.String(120), nullable=False)
token_mask = db.Column(db.String(120), unique=True, nullable=False)
created_at = db.Column(db.DateTime, nullable=False,
default=datetime.utcnow)
test_db.py
from app import app
from flask_sqlalchemy import SQLAlchemy
import pytest
from magic_tokens import MagicToken
app.config['SQLALCHEMY_DATABASE_URI'] = f'postgresql://{user}:{password}@{host}:{port}/{db_name}'
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
tdb = SQLAlchemy(app)
@pytest.fixture
def db():
tdb.create_all() #doesn't see MagicToken class
yield tdb
tdb.drop_all()
def test_db(db):
mt = MagicToken(email="email", token_mask="mask")
db.session.add(mt)
db.session.commit()
【问题讨论】:
标签: python postgresql flask sqlalchemy pytest