首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >pytest中_sa_instance_state的SQLAlchemy对象抛出属性错误

pytest中_sa_instance_state的SQLAlchemy对象抛出属性错误
EN

Stack Overflow用户
提问于 2021-01-05 20:34:21
回答 1查看 361关注 0票数 1

我找不到任何其他讨论为SQLAlchemy对象的'sa_instance_state‘获取属性错误的帖子。在pytest方法中调用Voterlist.query.all()时,我得到了这个错误。当我在API内或其他任何地方调用Voterlist.query.all()时,我没有得到这个错误。

这是一个具有前端和api蓝图的Flask应用程序。前端调用API。

conftest.py:

代码语言:javascript
运行
AI代码解释
复制
class TestConfig(Config):                                                                                                                                   
    TESTING = True                                                                                                                                          
    SQLALCHEMY_DATABASE_URI = 'sqlite:///test.db'                                                                                                           
    WTF_CSRF_ENABLED = False                                                                                                                                
    BCRYPT_LOG_ROUNDS = 4                                                                                                                                   
                                                                                                                                                            
def fill_database():                                                                                                                                        
    s0 = Source(title='Catalist')                                                                                                                           
    s1 = Source(title='L2')                                                                                                                                 
    sources = [s0, s1]                                                                                                                                      
    l0 = Voterlist(description='Test List 0')                                                                                                               
    l1 = Voterlist(description='Test List 1')                                                                                                               
    lists = [l0, l1]                                                                                                                                        
    return lists, sources                                                                                                                                   
                                                                                                                                                            
@pytest.fixture(scope='class')                                                                                                                              
def test_client():                                                                                                                                          
    flask_app = create_app(TestConfig)                                                                                                                      
    with flask_app.test_client() as client:                                                                                                                 
        app_context = flask_app.test_request_context()                                                                                                      
        app_context.push()                                                                                                                                  
        db.create_all()                                                                                                                                     
        lists, sources = fill_database()                                                                                                                    
        for s in sources:                                                                                                                                   
            db.session.add(s)                                                                                                                               
            db.session.commit()                                                                                                                             
        for l in lists:                                                                                                                                     
            db.session.add(l)                                                                                                                        
            db.session.commit()                                                                                                                             
            sleep(1)                                                                                                                                        
        yield client                                                                                                                                        
        db.drop_all()                                                                                                                                       
    app_context.pop() 

test_api.py:

代码语言:javascript
运行
AI代码解释
复制
@pytest.mark.usefixtures('test_client')                                                                                                                     
class TestLists():                                                                                                                                          
    def test_get_lists(self, test_client):                                                                                                                  
        '''Test download all lists.'''                                                                                                                      
        response = test_client.get(url_for('api.lists'))                                                                                                    
        resplists = response.json['lists']                                                                                                                  
        assert type(resplists) == list                                                                                                                      
        dblists = Voterlist.query.all() <<<< Error here

接口方法:

代码语言:javascript
运行
AI代码解释
复制
class ListAPI(Resource):                                                                                                                                    
    def __init__(self):                                                                                                                                     
        self.reqparse = reqparse.RequestParser()                                                                                                            
        self.fields = ['description', 'vendorquery', 'campaign', 's3key',                                                                                   
                       'ftimestamp', 'fname', 'source', 'user']                                                                                             
        for f in self.fields:                                                                                                                               
            self.reqparse.add_argument(f,                                                                                                                   
                                       type=str,                                                                                                            
                                       location='json')                                                                                                     
        super(ListAPI, self).__init__()                                                                                                                     
                                                                                                                                                            
    def get(self):                                                                                                                                          
        """Returns all lists."""                                                                                                                            
        try:                                                                                                                                                
            alllists = Voterlist.query.all()                                                                                                                
            lists = []                                                                                                                                      
            for l in alllists:                                                                                                                              
                l = l.__dict__                                                                                                                              
                l.pop('_sa_instance_state', None)                                                                                                           
                lists.append(l)                                                                                                                             
            return jsonify({'lists': lists})                                                                                                                
        except Exception as e:                                                                                                                              
            print(e)                                                                                                                                        
            abort(400, str(e)) 

您可以看到,当API方法调用Voterlist.query.all()时,它可以工作,甚至可以清楚地包含_sa_instance_state属性,否则,当我从列表中的每个对象中弹出该属性时,它将抛出相同的错误。

下面是Voterlist对象的定义:

代码语言:javascript
运行
AI代码解释
复制
class Voterlist(db.Model):
    id = db.Column(db.Integer, primary_key=True, default=get_time)
    description = db.Column(db.String(128))
    vendorquery = db.Column(db.String(128))
    campaign = db.Column(db.String(128))
    s3key = db.Column(db.String(128))
    fname = db.Column(db.String(128))
    ftimestamp = db.Column(db.Integer)
    source = db.Column(db.String(128))
    user = db.Column(db.String(128))
    status = db.Column(db.Integer, default=0)

    def __repr__(self):
        return '<List {}: {}>'.format(self.id, self.campaign)

下面是pytest的完整输出,以防万一:

代码语言:javascript
运行
AI代码解释
复制
=================================================================== test session starts ====================================================================
platform linux -- Python 3.6.9, pytest-6.0.1, py-1.9.0, pluggy-0.13.1
rootdir: /home/alazar66/Downloads/data/rl/rlabs-voter-list-mgr
plugins: anyio-2.0.2
collected 1 item                                                                                                                                           

tests/functional/test_api.py F                                                                                                                       [100%]

========================================================================= FAILURES =========================================================================
_________________________________________________________________ TestLists.test_get_lists _________________________________________________________________

self = <test_api.TestLists object at 0x74c48f8ff208>, test_client = <FlaskClient <Flask 'app'>>

    def test_get_lists(self, test_client):
        '''Test download all lists.'''
        response = test_client.get(url_for('api.lists'))
        resplists = response.json['lists']
        assert type(resplists) == list
>       dblists = Voterlist.query.all()

tests/functional/test_api.py:15: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
/home/alazar66/.local/lib/python3.6/site-packages/sqlalchemy/orm/query.py:3373: in all
    return list(self)
/home/alazar66/.local/lib/python3.6/site-packages/sqlalchemy/orm/loading.py:100: in instances
    cursor.close()
/home/alazar66/.local/lib/python3.6/site-packages/sqlalchemy/util/langhelpers.py:70: in __exit__
    with_traceback=exc_tb,
/home/alazar66/.local/lib/python3.6/site-packages/sqlalchemy/util/compat.py:182: in raise_
    raise exception
/home/alazar66/.local/lib/python3.6/site-packages/sqlalchemy/orm/loading.py:80: in instances
    rows = [proc(row) for row in fetch]
/home/alazar66/.local/lib/python3.6/site-packages/sqlalchemy/orm/loading.py:80: in <listcomp>
    rows = [proc(row) for row in fetch]
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

row = (1609879216, 'Test List 0', None, None, None, None, None, None, None, 0)

    def _instance(row):
    
        # determine the state that we'll be populating
        if refresh_identity_key:
            # fixed state that we're refreshing
            state = refresh_state
            instance = state.obj()
            dict_ = instance_dict(instance)
            isnew = state.runid != runid
            currentload = True
            loaded_instance = False
        else:
            # look at the row, see if that identity is in the
            # session, or we have to create a new one
            identitykey = (
                identity_class,
                tuple([row[column] for column in pk_cols]),
                identity_token,
            )
    
            instance = session_identity_map.get(identitykey)
    
            if instance is not None:
                # existing instance
>               state = instance_state(instance)
E               AttributeError: 'Voterlist' object has no attribute '_sa_instance_state'

/home/alazar66/.local/lib/python3.6/site-packages/sqlalchemy/orm/loading.py:532: AttributeError
================================================================= short test summary info ==================================================================
FAILED tests/functional/test_api.py::TestLists::test_get_lists - AttributeError: 'Voterlist' object has no attribute '_sa_instance_state'
==================================================================== 1 failed in 3.89s =====================================================================```
EN

回答 1

Stack Overflow用户

发布于 2021-01-05 23:00:23

我想通了。为了方便起见,我在API调用方法中不恰当地从对象__dict__属性中删除了'_sa_instance_state‘,并且在API调用之外仍然存在这种删除。

我就这样重写了API调用,并修复了它。

代码语言:javascript
运行
AI代码解释
复制
    def get(self):
        """Returns all lists."""
        try:
            alllists = Voterlist.query.all()
            lists = []
            for l in alllists:
                l = {k: v for (k, v) in l.__dict__.items()
                     if k != '_sa_instance_state'}
                lists.append(l)
            return jsonify({'lists': lists})
        except Exception as e:
            print(e)
            abort(400, str(e))
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65586172

复制
相关文章
项目中记录影响性能的缓慢数据库查询
如果程序性能随着时间推移不断降低,那很有可能是因为数据库查询变慢了,随着数据库规模的增长,这一情况还会变得更糟。优化数据库有时很简单,需要在程序和数据库之间加入缓存。大多数数据库查询语言都提供了explain语句,用来显示数据库执行查询时采取的步骤。从这些步骤中,我们经常能发现数据库或索引设计的不足之处。过 ,在开始优化查询之前,我们必须要知道哪些查询是值得优化的。在一次典型请求中,可能要执行多条数据库查询,所以经常很难分辨哪一条查询较慢。Flask-SQLAlchemy提供了一个选项,可以记录请求中执行的
用户1558882
2018/04/03
1.6K0
项目中记录影响性能的缓慢数据库查询
Swift — 面向对象中类和对象的属性
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/115585.html原文链接:https://javaforall.cn
全栈程序员站长
2022/07/10
2.6K0
SQLAlchemy中的自引用
SQLALCHEMY采用adjacency list pattern来表示类的自引用。 例如,对于类Node自引用: class Node(Base): __tablename__='node' id=Column(Integer,primary_key=True) parent_id=Column(Integer,ForeignKey('node.id')) data=Column(String(50)) children=relationship('Node') 对
用户1214487
2018/03/28
1.5K0
【C++ 语言】异常 ( 抛出字符串异常 | 抛出异常对象 | 抛出任意对象 | 抛出自定义异常 )
1. 异常处理 : 使用 " try{}catch(){} " 将抛出异常的代码包起来 , 注意将可能抛出异常的代码包裹在 try 后的大括号中 , 将异常处理逻辑放在 catch 后的大括号中 ;
韩曙亮
2023/03/27
1.3K0
对list中的对象属性排序
而Arrays.sort使用的是冒泡和归并排序,默认是归并排序,所以排序速度还是很快的.
IT小马哥
2020/03/18
2.4K0
sqlalchemy批量插入的坑
默认提供的bulk_save_objects是在一次事务中提交多次save 需求:一个sql语句插入多个实体 直接上代码 models.py from sqlalchemy import (Column, String, DateTime, UnicodeText, BigInteger, Boolean, Integer, Text, Float) from sqlalchemy import TypeDecorator from sqlalchemy.ext.declarative import dec
零式的天空
2022/03/22
1.6K0
Python - 类中的对象与属性
本文整理类中对象与属性(变量)相关知识。 类对象与实例对象 建立测试类: class Test: var_of_class = 'Class Var' def __init__(self): self.var_of_instance = 'Instance Var' 类对象 建立类进行编译后则形成了类对象,类对象仅支持两个操作: 实例化:使用instance_name = class_name()的方式实例化,实例化操作创建该类的实例。 属性引用:使用cl
为为为什么
2022/08/04
2.7K0
理解Python中的类对象、实例对象、属性、方法
class Animal(object): # 类对象 age = 0 # 公有类属性 __like = None # 私有类属性 def __init__(self): # 魔法方法 self.name = 'haha' # 公有实例属性 self.__sex = 'man' # 私有实例属性 def smile(self): # 公有方法 self指向实例对象 pass def __jump(
汪凡
2018/05/29
4K0
Jackson 动态过滤属性,编程式过滤对象中的属性
场景:有时候我们做系统的时候,比如两个请求,返回同一个对象,但是需要的返回字段并不相同。
全栈程序员站长
2022/07/20
4.5K0
css属性与js中style对象的属性对应表
css属性与js中style对象的属性对应表 CSS语法(不区分大小写) JavaScript语法(区分大小写) border border border-bottom borderBottom border-bottom-color borderBottomColor border-bottom-style borderBottomStyle border-bottom-width borderBottomWidth border-color borderColor border-left borderL
黑泽君
2018/10/11
7.7K0
Python3 初学实践案例(10)对象转字典 object to dict
版权声明:本文为 FengCms FungLeo 原创文章,允许转载,但转载必须注明出处并附带首发链接 https://blog.csdn.net/FungLeo/article/details/78873361
FungLeo
2019/05/26
8240
如何遍历JavaScript中对象属性
在2016年6月发布的ECMAScript 2016的同一时期,令JavaScript开发人员开心的是知道另一组很棒的提案已经达到了第4阶段(完成)。
疯狂的技术宅
2019/03/27
3.6K0
如何遍历JavaScript中对象属性
Tornado中sqlalchemy使用
在学tornado的时候涉及以下数据库操作,现在暂时使用mysql数据库,所以选择了一个比较好用的ORM工具sqlalchemy,顺便记一下使用过程 安装 首先安装mysql pip安装必要的库:pip install sqlalchemy 下载mysql-python驱动: http://www.codegood.com/archives/129 如果是32位版本的windows选win32,如果是64的可以选择amd64 配置 首先需要一个数据库配置文件 # -*- coding: utf-8 -*-
NaOH
2018/05/29
1.6K0
Python中的ORM工具:SQLAlchemy
ORM全称Object Relational Mapping, 翻译过来叫对象关系映射。在Python生态中,目前较为流行的ORM模块有SQLAlchemy和peewee,类比Java中有Hibernate和MyBatis。本文关注SQLAlchemy的快速上手,展示一个简单的 CRUD 示例,并结合使用 Faker 生成测试数据。
happyJared
2018/10/10
1.4K0
SQLAlchemy SQLAlchemy
SQLAlchemy 1.1.SQLAlchemy介绍 SQLAlchemy是一个基于Python实现的ORM框架。该框架建立在 DB API之上,使用关系对象映射进行数据库操作,简言之便是:将类和对象转换成SQL,然后使用数据API执行SQL并获取执行结果。 安装 pip install sqlalchemy 组成部分 Engine,框架的引擎 Connection Pooling ,数据库连接池 Dialect,选择连接数据库的DB API种类 Schema/Types,架构和类型 SQL Exprr
zhang_derek
2018/05/30
2.3K0
JavaScript——对象的属性
在JavaScript中,所有的对象都是一组属性的集合,属性可以是数值,字符串等原始类型,也可以是函数,或者是其他对象。
Html5知典
2019/11/26
2.5K0
面向对象中Object常用属性总结
Object.prototype.constructor:特定的函数,用户创建一个对象的原型。
小周sir
2019/09/23
9570
MapReduce 编程实践:统计对象中的某些属性
文章目录 1. 生成数据 2. 编写实体类 3. Mapper类 4. Reducer类 5. Driver类 6. 运行 参考书:《Hadoop大数据原理与应用》 相关文章:MapReduce 编程实践 1. 生成数据 超市消费者 数据: id, 时间,消费金额,会员/非会员 使用 Python 生成虚拟数据 import random import time consumer_type = ['会员', '非会员'] vip, novip = 0, 0 vipValue, novipValue = 0
Michael阿明
2021/09/06
9130
Spring框架中 Bean对象属性值的注入
注意:如果一个Bean对象同时存在set注入和构造注入两种方法,Spring在为Bean对象属性赋值时,会先使用set注入方式为属性赋值,再使用构造注入为Bean对象属性赋值。
运维搬砖
2018/12/26
4.1K0
点击加载更多

相似问题

SQLAlchemy 'str‘对象没有属性'_sa_instance_state’

10

SQLAlchemy 'dict‘对象没有属性'_sa_instance_state’

210

SqlAlchemy AttributeError:'str‘对象没有属性'_sa_instance_state’

12

SQLAlchemy: AttributeError:'unicode‘对象没有属性'_sa_instance_state’

11

AttributeError:“str”对象没有属性“”_sa_instance_state“”- Flask SqlAlchemy

113
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文