Session 如何解决';已在此元数据实例中定义';烧瓶Pytest、SqlAlchemy和烧瓶会话出错?
我对SQLAlchemy、Flask(特别是使用pytest进行测试)和Flask会话库有问题 当我尝试设置基本测试客户端时,我会收到以下警告和错误,这些警告和错误会阻止所有测试工作:Session 如何解决';已在此元数据实例中定义';烧瓶Pytest、SqlAlchemy和烧瓶会话出错?,session,flask,sqlalchemy,pytest,Session,Flask,Sqlalchemy,Pytest,我对SQLAlchemy、Flask(特别是使用pytest进行测试)和Flask会话库有问题 当我尝试设置基本测试客户端时,我会收到以下警告和错误,这些警告和错误会阻止所有测试工作: SAWarning: This declarative base already contains a class with the same class name and module name as flask_session.sessions.Session, and will be replaced in
SAWarning: This declarative base already contains a class with the same class name and module name as flask_session.sessions.Session, and will be replaced in the string-lookup table.
根据我所做的研究,如果我自己创建了这个会话模型,我会尝试添加现有的extend_,这可能会解决问题,但我创建的任何模型中都没有,所以我不确定如何解决这个问题
任何建议都将不胜感激!多谢各位
init.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from flask import Flask
from flask import session
from flask_session import Session
from flask_sqlalchemy import SQLAlchemy
# Initialize database object
db=SQLAlchemy()
sess = Session()
def create_app(test=False):
"""Construct the core application."""
app = Flask(__name__)
if test:
app.config.from_object('config.TestConfig')
else:
app.config.from_object('config.Config')
# Configure db connection, initialize sessions
db.app = app
db.init_app(app)
app.config['SESSION_SQLALCHEMY'] = db
sess.init_app(app)
with app.app_context():
from . import routes # Import routes
db.create_all() # Create database tables for our data models
return app
import os, sys
# sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
# import main
import os
import tempfile
import flask
import pytest
from err_app import create_app,create_app_test, db, sess
import err_app
from flask_session import Session
from flask_sqlalchemy import SQLAlchemy
@pytest.fixture(scope='module')
def test_client():
# flask_app = create_app_test()
flask_app = create_app(test=True)
# Establish an application context before running the tests.
ctx = flask_app.app_context()
ctx.push()
if flask_app.config['TESTING'] == True:
print("EMPTYING AND RE CREATING DATABASE")
db.drop_all()
from err_app.models import ErrorModel, ErrorParameterModel, TemplatesModel, UsersModel
db.create_all()
# sess.init_app(flask_app)
# flask_app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///' + os.path.join(basedir, 'test.db')
# Flask provides a way to test your application by exposing the Werkzeug test Client
# and handling the context locals for you.
testing_client = flask_app.test_client()
yield testing_client # this is where the testing happens!
ctx.pop()
def test_create_app():
app = create_app(test=True)
assert app
assert app.config['TESTING'] == True
def test_home_page(test_client):
"""
GIVEN a Flask application
WHEN the '/' page is requested (GET)
THEN check the response is valid
"""
response = test_client.get('/calculate_bounds')
print(response)
# print(response.text)
assert response.status_code == 200
test_basic.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from flask import Flask
from flask import session
from flask_session import Session
from flask_sqlalchemy import SQLAlchemy
# Initialize database object
db=SQLAlchemy()
sess = Session()
def create_app(test=False):
"""Construct the core application."""
app = Flask(__name__)
if test:
app.config.from_object('config.TestConfig')
else:
app.config.from_object('config.Config')
# Configure db connection, initialize sessions
db.app = app
db.init_app(app)
app.config['SESSION_SQLALCHEMY'] = db
sess.init_app(app)
with app.app_context():
from . import routes # Import routes
db.create_all() # Create database tables for our data models
return app
import os, sys
# sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
# import main
import os
import tempfile
import flask
import pytest
from err_app import create_app,create_app_test, db, sess
import err_app
from flask_session import Session
from flask_sqlalchemy import SQLAlchemy
@pytest.fixture(scope='module')
def test_client():
# flask_app = create_app_test()
flask_app = create_app(test=True)
# Establish an application context before running the tests.
ctx = flask_app.app_context()
ctx.push()
if flask_app.config['TESTING'] == True:
print("EMPTYING AND RE CREATING DATABASE")
db.drop_all()
from err_app.models import ErrorModel, ErrorParameterModel, TemplatesModel, UsersModel
db.create_all()
# sess.init_app(flask_app)
# flask_app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///' + os.path.join(basedir, 'test.db')
# Flask provides a way to test your application by exposing the Werkzeug test Client
# and handling the context locals for you.
testing_client = flask_app.test_client()
yield testing_client # this is where the testing happens!
ctx.pop()
def test_create_app():
app = create_app(test=True)
assert app
assert app.config['TESTING'] == True
def test_home_page(test_client):
"""
GIVEN a Flask application
WHEN the '/' page is requested (GET)
THEN check the response is valid
"""
response = test_client.get('/calculate_bounds')
print(response)
# print(response.text)
assert response.status_code == 200
型号
from . import db
# from flask_sqlalchemy import SQLAlchemy
# db=SQLAlchemy()
class ErrorModel(db.Model):
"""Data model for ErrorModel accounts."""
__tablename__ = 'err-models-table'
id = db.Column(db.Integer,
primary_key=True)
model_name = db.Column(db.Text,
index=False,
unique=False,
nullable=False)
model_zip_attachment = db.Column(db.LargeBinary,
index=False,
unique=False,
nullable=False)
model_csv = db.Column(db.LargeBinary,
index=False,
unique = False,
nullable = False)
created_at = db.Column(db.DateTime,
index=False,
unique=False,
nullable=False)
model_version= db.Column(db.Text,
index=False,
unique=False,
nullable=False)
app_version= db.Column(db.Text,
index=False,
unique=False,
nullable=False)
notes = db.Column(db.Text,
index=False,
unique=False,
nullable=True)
def __repr__(self):
return '<ErrorModel {}>'.format(self.model_name)
class ErrorParameterModel(db.Model):
"""Data model for ErrorModel accounts."""
__tablename__ = 'err-parameters'
id = db.Column(db.Integer,
primary_key=True)
error_description = db.Column(db.Text,
index=False,
unique=False,
nullable=False)
error_label = db.Column(db.Text,
index=False,
unique=False,
nullable=False)
template_id = db.Column(db.Integer,db.ForeignKey("templates.id", ondelete="CASCADE"))
block_description = db.Column(db.Text,
index=False,
unique=False,
nullable=False)
block_labels = db.Column(db.ARRAY(db.Text),
index=False,
unique=False,
nullable=False)
input_type = db.Column(db.Text,
index=False,
unique=False,
nullable=False)
uncorr_determ = db.Column(db.Text,
index=False,
unique=False,
nullable=False)
value = db.Column(db.Text,
index=False,
unique=False,
nullable=False)
unit = db.Column(db.Text,
index=False,
unique=False,
nullable=True)
created_at = db.Column(db.DateTime,
index=False,
unique=False,
nullable=False)
notes = db.Column(db.Text,
index=False,
unique=False,
nullable=True)
def __repr__(self):
return '<ErrorModel {}>'.format(self.error_description)
class TemplatesModel(db.Model):
"""Data model for ErrorModel accounts."""
__tablename__ = 'templates'
id = db.Column(db.Integer,
primary_key=True)
name = db.Column(db.Text,
index=False,
unique=False,
nullable=False)
user_id= db.Column(db.Integer,db.ForeignKey("users.id"))
created_at = db.Column(db.DateTime,
index=False,
unique=False,
nullable=False)
project = db.Column(db.Text,
index=False,
unique=False,
nullable=True)
gauge_hw = db.Column(db.Text,
index=False,
unique=False,
nullable=True)
error_model_version = db.Column(db.Text,
index=False,
unique=False,
nullable=True)
model_number = db.Column(db.Text,
index=False,
unique=False,
nullable=True)
num_sigmas = db.Column(db.Text,
index=False,
unique=False,
nullable=True)
notes = db.Column(db.Text,
index=False,
unique=False,
nullable=True)
children = db.relationship('ErrorParameterModel', cascade='all,delete', backref='templates')
def __repr__(self):
return '<Table {}>'.format(self.name)
class UsersModel(db.Model):
"""Data model for ErrorModel accounts."""
__tablename__ = 'users'
id = db.Column(db.Integer,
primary_key=True)
created_at = db.Column(db.DateTime,
index=False,
unique=False,
nullable=False)
来自。导入数据库
#从flask_sqlalchemy导入sqlalchemy
#db=SQLAlchemy()
类错误模型(db.Model):
“”“ErrorModel帐户的数据模型。”“”
__tablename_uu='err models table'
id=db.Column(db.Integer,
主(主键=真)
model_name=db.Column(db.Text,
索引=假,
唯一=错误,
可空=假)
model_zip_attachment=db.Column(db.LargeBinary,
索引=假,
唯一=错误,
可空=假)
model_csv=db.Column(db.LargeBinary,
索引=假,
唯一=错误,
可空=假)
在=db.Column(db.DateTime,
索引=假,
唯一=错误,
可空=假)
model_version=db.Column(db.Text,
索引=假,
唯一=错误,
可空=假)
app_version=db.Column(db.Text,
索引=假,
唯一=错误,
可空=假)
注释=db.列(db.Text,
索引=假,
唯一=错误,
nullable=True)
定义报告(自我):
返回“”。格式(self.model\u名称)
类ErrorParameterModel(数据库模型):
“”“ErrorModel帐户的数据模型。”“”
__tablename_uu='err parameters'
id=db.Column(db.Integer,
主(主键=真)
错误描述=db.Column(db.Text,
索引=假,
唯一=错误,
可空=假)
错误\u label=db.Column(db.Text,
索引=假,
唯一=错误,
可空=假)
template\u id=db.Column(db.Integer,db.ForeignKey(“templates.id”,ondelete=“CASCADE”))
block_description=db.Column(db.Text,
索引=假,
唯一=错误,
可空=假)
block_labels=db.Column(db.ARRAY(db.Text)),
索引=假,
唯一=错误,
可空=假)
输入类型=db.Column(db.Text,
索引=假,
唯一=错误,
可空=假)
uncorr_determ=db.列(db.Text,
索引=假,
唯一=错误,
可空=假)
值=db.Column(db.Text,
索引=假,
唯一=错误,
可空=假)
单位=分贝列(分贝文本,
索引=假,
唯一=错误,
nullable=True)
在=db.Column(db.DateTime,
索引=假,
唯一=错误,
可空=假)
注释=db.列(db.Text,
索引=假,
唯一=错误,
nullable=True)
定义报告(自我):
返回“”。格式(自身错误\u说明)
类模板模型(db.Model):
“”“ErrorModel帐户的数据模型。”“”
__tablename_uu='templates'
id=db.Column(db.Integer,
主(主键=真)
name=db.Column(db.Text,
索引=假,
唯一=错误,
可空=假)
user\u id=db.Column(db.Integer,db.ForeignKey(“users.id”))
在=db.Column(db.DateTime,
索引=假,
唯一=错误,
可空=假)
project=db.Column(db.Text,
索引=假,
唯一=错误,
nullable=True)
仪表=分贝柱(分贝文本,
索引=假,
唯一=错误,
nullable=True)
错误\u模型\u版本=db.Column(db.Text,
索引=假,
唯一=错误,
nullable=True)
型号=db.列(db.Text,
索引=假,
唯一=错误,
nullable=True)
num_sigmas=db.Column(db.Text,
索引=假,
唯一=错误,
nullable=True)
注释=db.列(db.Text,
索引=假,
唯一=错误,
nullable=True)
children=db.relationship('ErrorParameterModel',cascade='all,delete',backref='templates')
定义报告(自我):
返回“”。格式(self.name)
类UsersModel(db.Model):
“”“ErrorModel帐户的数据模型。”“”
__tablename_uu='users'
id=db.Column(db.Integer,
主(主键=真)
在=db.Column(db.DateTime,
索引=假,
唯一=错误,