如何使用反射数据库测试 SQLAlchemy
How to test SQLAlchemy with reflected database
由于我的 Flask 应用程序不应在我的数据库中写入任何内容,因此我设置了 Flask-SQLAlchemy 来反映我的数据库。这样,当我更改架构时,我不必更改模型:
# 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)
由于我的 Flask 应用程序不应在我的数据库中写入任何内容,因此我设置了 Flask-SQLAlchemy 来反映我的数据库。这样,当我更改架构时,我不必更改模型:
# 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)