Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
不可序列化JSON-Python+;烧瓶+;炼金术_Python_Mysql_Json_Flask_Sqlalchemy - Fatal编程技术网

不可序列化JSON-Python+;烧瓶+;炼金术

不可序列化JSON-Python+;烧瓶+;炼金术,python,mysql,json,flask,sqlalchemy,Python,Mysql,Json,Flask,Sqlalchemy,我正在编写一个小查询,从mysql数据库中获取数据, 我有一个报告表,里面有report\u id,我需要查询来自api参数的与report\u id匹配的数据 我的职能: def view_single_thumbnail(idx): // idx coming from params session = Session() result = session.query( Report ).filter( Report.report_

我正在编写一个小查询,从
mysql
数据库中获取数据, 我有一个报告表,里面有
report\u id
,我需要查询来自
api
参数的与
report\u id
匹配的数据

我的职能:

def view_single_thumbnail(idx): // idx coming from params 
    session = Session()

    result = session.query(
        Report
    ).filter(
        Report.report_id == idx
    ).all()

    return jsonify({
        'data': result
    })

抛出错误:
'0x00001C1FSDFSf51E6A90'处的components.db.core.table_declaration.Report对象不是JSON可序列化的

SQLAlchemy对象无法通过
jsonify
自动序列化。您可以将属性添加到SQLAlchemy模型
class

class Report(db.Model):
    def __init__(self):
        ...

    @property
    def serialized(self):
        """Return object data in serializeable format"""
        return {
            'id': self.id,
            'report_text': "Some text",
            ...
        }
您的视图将更新为:

def view_single_thumbnail(idx): // idx coming from params 
    session = Session()

    result = session.query(
        Report
    ).filter(
        Report.report_id == idx
    ).all()

    return jsonify({
        'data': [result.serialized for result in results]
    })

SQLAlchemy对象不能通过
jsonify
自动序列化。您可以将属性添加到SQLAlchemy模型
class

class Report(db.Model):
    def __init__(self):
        ...

    @property
    def serialized(self):
        """Return object data in serializeable format"""
        return {
            'id': self.id,
            'report_text': "Some text",
            ...
        }
您的视图将更新为:

def view_single_thumbnail(idx): // idx coming from params 
    session = Session()

    result = session.query(
        Report
    ).filter(
        Report.report_id == idx
    ).all()

    return jsonify({
        'data': [result.serialized for result in results]
    })

如果我没记错的话,查询的结果就是一个对象,在尝试将其转换为json之前,应该先将其转换为
dict
。我在一个老项目中使用了一个简单的
lambda
函数

# Lambda vesion
# row2dict = lambda r: {c.name: str(getattr(r, c.name)) for c in r.__table__.columns}

# Function version
def row2dict(row):
    return {
        c.name: str(getattr(row, c.name))
        for c in row.__table__.columns
    }

def view_single_thumbnail(idx): // idx coming from params 
    session = Session()

    result = [
           row2dict(report)
           for report in session.query(Report)
                  .filter(Report.report_id == idx)
                  .all()
    ]

    return jsonify({
        'data': result
    })

如果我没记错的话,查询的结果就是一个对象,在尝试将其转换为json之前,应该先将其转换为
dict
。我在一个老项目中使用了一个简单的
lambda
函数

# Lambda vesion
# row2dict = lambda r: {c.name: str(getattr(r, c.name)) for c in r.__table__.columns}

# Function version
def row2dict(row):
    return {
        c.name: str(getattr(row, c.name))
        for c in row.__table__.columns
    }

def view_single_thumbnail(idx): // idx coming from params 
    session = Session()

    result = [
           row2dict(report)
           for report in session.query(Report)
                  .filter(Report.report_id == idx)
                  .all()
    ]

    return jsonify({
        'data': result
    })


我不能理解这一点,我是python/flask的初学者。我需要把它放在哪里?您必须将属性添加到
报告中。当您添加属性
serialize
jsonify时,它将调用该属性以获取可序列化的字典。它应该是
result.serialize
(不带括号)而不是
result.serialize()
啊,我会解决这个问题。谢谢,你太棒了!(双关语)我不能理解这一点,我是python/flask的初学者。我需要把它放在哪里?您必须将属性添加到
报告中。当您添加属性
serialize
jsonify时,它将调用该属性以获取可序列化的字典。它应该是
result.serialize
(不带括号)而不是
result.serialize()
啊,我会解决这个问题。谢谢,你太棒了!(双关语)有没有不使用第三方库(如lambda)的方法?
lamba
是python中的内置关键字。这只是声明函数的一种简化方式。row2dict实际上做什么?默认情况下,
查询
返回一个对象,而不是可序列化的对象。
row2dict
所做的是,它将运行对象的所有属性,
Report
对象用于本例,然后将其转换为
dict
。AttributeError:“Report”对象没有属性“id”,有没有不使用第三方库(如lambda)的方法?
lamba
是python中的内置关键字。这只是声明函数的一种简化方式。row2dict实际上做什么?默认情况下,
查询
返回一个对象,而不是可序列化的对象。
row2dict
所做的是,它运行对象的所有属性,在这种情况下,
Report
对象,然后将其转换为
dict
。AttributeError:“Report”对象没有属性“id”