Dva*_*amp 7 python flask-sqlalchemy
我是第一次尝试一起使用 Flask 应用程序工厂模式和 pytest 框架。我开始对 sqlite db 后端进行基本的健全性测试,尽管到目前为止测试工作正常并且我看到测试 db 文件已成功创建,但 falsk_sqlalchemy 告诉我它没有定义 db 后端。我试图找到 pdb 和交互式控制台的问题 - 一切看起来都很正常。看起来它与任何人都可以帮助我了解问题出在哪里有关?
(venv) C:\Users\dv\PycharmProjects\ste-speach-booking>python -m pytest tests/
=========================== test session starts ============================
platform win32 -- Python 3.6.8, pytest-5.1.1, py-1.8.0, pluggy-0.12.0
rootdir: C:\Users\dv\PycharmProjects\ste-speach-booking
collected 3 items
tests\test_models.py ... [100%]
============================= warnings summary =============================
tests/test_models.py::test_init
C:\Users\d837758\PycharmProjects\ste-speach-booking\venv\lib\site-packages\flask_sqlalchemy\__init__.py:814: UserWarning: Neither SQLALCHEMY_DATABASE_URI nor SQLALCHEMY_BINDS is set. Defaulting SQLALCHEMY_DATABASE_URI to "sqlite:///:memory:".
'Neither SQLALCHEMY_DATABASE_URI nor SQLALCHEMY_BINDS is set. '
Run Code Online (Sandbox Code Playgroud)
test_models 中的初始测试:
import pytest
import src.models
import datetime
def test_ActionTypes(db):
actiontype1 = src.models.Act_types(action_tyoe='workshop')
db.session.add(actiontype1)
db.session.commit()
actiontype2 = src.models.Act_types(action_tyoe='speech')
db.session.add(actiontype2)
db.session.commit()
count = db.session.query(src.models.Act_types).count()
assert count is 2
def test_meeting_creation(db):
meeting = src.models.Meeting(
_date = datetime.datetime.strptime('2018-12-19', "%Y-%m-%d"),
)
db.session.add(meeting)
db.session.commit()
Run Code Online (Sandbox Code Playgroud)
数据库的 conftest 固定装置:
import os
import pytest
import src.config
from src import create_app
from src import db as _db
@pytest.fixture(scope='session')
def db():
"""Session-wide test database."""
TESTDB_PATH = src.config.testDB
print(TESTDB_PATH)
if os.path.exists(TESTDB_PATH):
os.unlink(TESTDB_PATH)
app = create_app(config=src.config.TestingConfig)
with app.app_context():
_db.create_all()
yield _db
_db.drop_all()
os.unlink(TESTDB_PATH)
Run Code Online (Sandbox Code Playgroud)
应用工厂:
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
db = SQLAlchemy()
def create_app(config=None):
"""Construct the core application."""
app = Flask(__name__, instance_relative_config=True)
db.init_app(app)
if config is None:
app.config.from_object(config.BaseConfig)
else:
app.config.from_object(config)
with app.app_context():
# Imports
from . import routes
db.create_all()
return app
Run Code Online (Sandbox Code Playgroud)
配置文件:
basedir = os.path.abspath(os.path.dirname(__file__))
baseDB = os.path.join(basedir, 'app.db')
devDB = os.path.join(basedir, 'dev_app.db')
testDB = os.path.join(basedir, 'testing_app.db')
class BaseConfig(object):
DEBUG = False
TESTING = False
SECRET_KEY = os.environ.get('SECRET_KEY') or 'you-will-never-guess'
SQLALCHEMY_DATABASE_URI = os.environ.get('DATABASE_URL') or \
'sqlite:///' + baseDB
SQLALCHEMY_TRACK_MODIFICATIONS = False
class TestingConfig(BaseConfig):
DEBUG = False
TESTING = True
SQLALCHEMY_DATABASE_URI = os.environ.get('DATABASE_URL') or \
'sqlite:///' + testDB
Run Code Online (Sandbox Code Playgroud)
Sup*_*oot 20
问题在于应用程序组件在create_app().
当您调用db.init_app(app)它执行的第一个操作时(源):
if (
'SQLALCHEMY_DATABASE_URI' not in app.config and
'SQLALCHEMY_BINDS' not in app.config
):
warnings.warn(
'Neither SQLALCHEMY_DATABASE_URI nor SQLALCHEMY_BINDS is set. '
'Defaulting SQLALCHEMY_DATABASE_URI to "sqlite:///:memory:".'
)
Run Code Online (Sandbox Code Playgroud)
认出那个警告了吗?
它立即查找app.config所需的配置。该方法继续接受应用程序提供的配置或设置默认值,在这种情况下,默认值是内存数据库。
在应用程序本身被配置之前create_app()调用的实现中db.init_app(),使用以下命令:
db.init_app(app)
if config is None:
app.config.from_object(config.BaseConfig)
else:
app.config.from_object(config)
Run Code Online (Sandbox Code Playgroud)
在app.config填充之前,SQLALCHEMY_应用程序上不存在任何前缀配置,因此在db.init_app()查找它们时,找不到它们并使用默认值。db在app修复问题的配置之后移动 的配置:
if config is None:
app.config.from_object(config.BaseConfig)
else:
app.config.from_object(config)
db.init_app(app)
Run Code Online (Sandbox Code Playgroud)
这与此问题非常相似,但是我认为您的问题是典型设置(范围create_app()和配置方法)的更好示例,因此值得回答。
| 归档时间: |
|
| 查看次数: |
14949 次 |
| 最近记录: |