使用 Flask_SQLAalchemy 和 MariaDB 进行数据库模拟。使用 create_all 和 drop_all 方法创建或删除数据库失败

问题描述 投票:0回答:1

我正在尝试使用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
,但我不确定如何使用它来实现模拟。

python mocking mariadb flask-sqlalchemy python-unittest
1个回答
0
投票

看起来您需要在运行

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;
© www.soinside.com 2019 - 2024. All rights reserved.