首页 > 解决方案 > 如果我将 db 连接存储在 flask.g 对象上,如何让 Flask 连接到我的测试数据库?

问题描述

我有一个直接使用 pymysql 的 Flask 应用程序,没有 SQLAlchemy。

在我的 db.py 文件中,我有以下内容:

from myns.my_db import db_connect

def has_db():
  return hasattr(flask.g, 'db')

def get_db(name):
  if not has_db():
    setattr(flask.g, 'db', db_connect())
  return getattr(flask.g, 'db')

以及我的主要 app.py 中的这个:

@app.teardown_request
def close_db(ex):
  if has_db():
    conn = get_db()
    conn.close()

我想要做的是在测试中“模拟”数据库,使用这里的例子:https ://flask.palletsprojects.com/en/1.1.x/testing/#faking-resources-and-context

我在运行测试时遇到的错误是:

pymysql.err.InterfaceError: (0, '')

我以前用pymysql遇到过。我通常将此错误解释为有多个线程使用数据库游标,或者在多个模块中使用了全局数据库游标。这似乎是有道理的,因为我相信该flask.g对象是某种 thred-local 全局对象。

有没有办法在我的测试中“模拟”数据库连接,即使它涉及重新构建我的 Flask 应用程序?谢谢!

标签: pythonunit-testingtestingflaskpymysql

解决方案


问题是我有一个 self.db 连接,我试图用来:

  1. 设置数据库并安装架构
  2. 运行测试
  3. 并且还拆除了数据库

一旦我分离了这些步骤并为步骤 1、2 和 3 使用了新的连接,我就不再遇到问题了。


推荐阅读