Session 如何解决';已在此元数据实例中定义';烧瓶Pytest、SqlAlchemy和烧瓶会话出错?

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

我对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 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,
索引=假,
唯一=错误,