如何用反射数据库测试SQLAlChemy [英] How to test SQLAlchemy with reflected database

查看:24
本文介绍了如何用反射数据库测试SQLAlChemy的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

因为我的FlASK应用程序不应该在我的数据库中写入任何内容,所以我设置了FlaskSQLAlChemy来反映我的数据库。这样,当我更改我的模式时,我就不必更改我的模型:

# app/__init__.py
from flask import Flask
from flask_sqlalchemy import SQLAlchemy

db = SQLAlchemy()

def create_app():
    app = Flask(__name__)
    db.init_app(app)
    with app.app_context():
        db.Model.metadata.reflect(db.engine)
# app/models.py
from app import db

class Data(db.Model):
    __table__ = db.Model.metadata.tables['data']

这一切都运行得很好。但现在,我想使用unittest实现测试。但我找不到任何东西这是怎么回事?我习惯于制作一个新的SQLite数据库来测试,但我没有任何模型可以在那里编写。这里的标准程序是什么?您是否将所有内容都复制到Sqlite?如果是,如何?

推荐答案

这种情况没有一般规则:您的数据库与应用程序分离,因此您需要以某种方式获取数据库架构的副本以在本地重新创建。

许多数据库引擎提供了一种将数据库架构转储为文件的方法,该文件可用于将架构加载到另一台服务器(或使用不同名称的同一服务器)。

如果您希望坚持使用Python和SQLAlChemy工具,您可以通过在生产数据库上的反射填充数据库元数据,然后使用元数据在本地数据库上创建表。

类似以下内容:在生产服务器上:

import pickle

import sqlalchemy as sa


engine = sa.create_engine(PRODUCTION_DATABASE_URI)

metadata = sa.MetaData()
metadata.reflect(engine)

# Save the metadata so that it can be transferred to another machine.

with open('metadata.pkl', 'wb') as f:
    pickle.dump(metadata, f)

然后在本地

# Restore the metadata object
with open('metadata.pkl', 'rb') as f:
    metadata = pickle.load(f)

engine = sa.create_engine(TEST_DATABASE_URI)

# Create the tables
metadata.create_all(engine)

这篇关于如何用反射数据库测试SQLAlChemy的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆