【问题标题】:creating tables for SQLAlchemy models in a testing environment在测试环境中为 SQLAlchemy 模型创建表
【发布时间】: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


    【解决方案1】:

    可能是一个重复的问题,但这个答案目前对我有用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-11-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-23
      • 2021-07-30
      • 1970-01-01
      相关资源
      最近更新 更多