如何将SQLAlchemy连接到Django测试数据库?
解决Django测试中SQLAlchemy连接测试数据库的问题
核心问题原因
Django运行测试时会自动创建带前缀的测试数据库(比如原数据库是mydb,测试库会是test_mydb),但你直接读取settings.DATABASES['default']['NAME']拿到的是开发/生产环境的数据库名称,导致SQLAlchemy连接到了错误的数据库,和Django测试使用的库不一致。
正确的连接方案
方案1:直接复用Django当前的数据库配置
从Django的数据库连接对象中获取实际测试库的完整配置,而非直接读取settings:
from django.db import connection from sqlalchemy import create_engine # 获取Django当前正在使用的测试数据库配置 db_settings = connection._connections.settings['default'] database_url = ( f"postgresql+psycopg2://{db_settings['USER']}:{db_settings['PASSWORD']}@" f"{db_settings['HOST']}:{db_settings['PORT']}/{db_settings['NAME']}" ) engine = create_engine(database_url, echo=False)
这样就能确保SQLAlchemy和Django使用同一个测试数据库。
方案2:利用Django测试信号同步配置
如果需要在测试启动时自动完成配置,可以监听Django的test_started信号:
from django.test.signals import test_started from django.conf import settings from sqlalchemy import create_engine def setup_sqlalchemy_test_db(sender, **kwargs): # 测试启动后,Django已自动将settings中的数据库名称替换为测试库名称 db_conf = settings.DATABASES['default'] global engine engine = create_engine( f"postgresql+psycopg2://{db_conf['USER']}:{db_conf['PASSWORD']}@" f"{db_conf['HOST']}:{db_conf['PORT']}/{db_conf['NAME']}", echo=False ) test_started.connect(setup_sqlalchemy_test_db)
测试运行时,Django会自动更新settings.DATABASES['default']['NAME']为实际测试库名称,此时读取即可拿到正确值。
关于引擎名称的说明
Django的django.db.backends.postgresql本质是封装了psycopg2驱动,和SQLAlchemy的postgresql+psycopg2是对应的,两者底层使用同一个数据库驱动,只是上层封装不同,不存在兼容性问题。
内容的提问来源于stack exchange,提问作者Courvoisier
相关产品推荐
相关产品推荐

