我正在尝试使用flask和unittest来实现数据库模拟。我见过的示例使用 Flask-SQLAlchemy 的
db.create_all()
和 db.drop_all()
方法以及 unittest 的 setUp()
和 tearDown()
方法来准备测试装置。然而,这些都是 SQLite 独有的。查看文档,db.create_all()
仅创建表而不创建数据库。同样,只有使用 db.drop_all()
删除表。我假设 SQLite 的行为有所不同,因为它是一个嵌入式、基于文件的 RDBMS。
所以我的问题是,当数据库尚未创建时(在我的例子中是 MariaDB 数据库),如何使用 Flask 实现数据库模拟?我看到 Flask-SQLAlchemy 为引擎提供了
db.engine
,但是当我检查引擎时,它指定了我的 SQLALCHEMY_DATABASE_URI
...它指定了不存在的数据库。
>>> db.engine
Engine(mysql+pymysql://admin@localhost/test_db?charset=utf8mb4)
这是 Miguel Grinberg 的书 Flask Web Development 中的示例。
import unittest
from flask import current_app
from app import create_app, db
class BasicsTestCase(unittest.TestCase):
def setUp(self):
self.app = create_app('testing')
self.app_context = self.app.app_context()
self.app_context.push()
db.create_all() # raise pymysql.err.OperationalError "Unknown database 'test_db'"
def tearDown(self):
db.session.remove()
db.drop_all()
self.app_context.pop()
# raise pymysql.err.OperationalError "Unknown database 'test_db'"
我确实认为我需要使用可用的
db.engine
,但我不确定如何使用它来实现模拟。
看起来您需要在运行
setUp
之前创建用户/数据库:
连接到数据库并使用 SQL 创建数据库和用户:
CREATE DATABASE IF NOT EXISTS test_db;
CREATE USER IF NOT EXISTS admin@localhost IDENTIFIED BY 'secretpassword';
GRANT ALL ON test_db.* to admin@localhost;