小编Jos*_*osh的帖子

SQLAlchemy @property 使用 dump_only 在棉花糖中导致“未知字段”错误

我正在使用烧瓶棉花糖(棉花糖=v3.0.0rc1,烧瓶棉花糖=0.9.0)和烧瓶sqlalchemy(sqlalchemy=1.2.16,flask-sqlalchemy=2.3.2)

我有这个模型和模式。

from marshmallow import post_load, fields
from .datastore import sqla_database as db
from .extensions import marshmallow as ma

class Study(db.Model):
    _id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String, nullable=False)

    tests = db.relationship("Test", backref="study", lazy='select', cascade="all, delete-orphan")

    @property
    def test_count(self):
        return len(self.tests)

class StudySchema(ma.ModelSchema):
    test_count = fields.Integer(dump_only=True)
    class Meta:
        model = Study
        sqla_session = db.session

schema = StudySchema()
payload = request.get_json()
schema.load(data=payload, instance=Study.query.get(payload["_id"]))
schema.session.commit()
Run Code Online (Sandbox Code Playgroud)

如果我使用此有效负载执行 PUT 操作,则会 {'_id': 1, 'name': 'Study1', 'test_count': 0}出现以下异常marshmallow.exceptions.ValidationError: {'test_count': ['Unknown field.']}

如果我删除了dump_only=True这个异常 …

python sqlalchemy flask flask-sqlalchemy marshmallow

5
推荐指数
1
解决办法
3498
查看次数

SqlAlchemy在查询表对象时不返回所有行,但是在查询表对象列时返回所有行

更新-下面的解决方案

我对SqlAlchemy非常陌生,因此如果这是一个明显的问题,请原谅。当查询Table对象时,我只会得到一个结果(数据库中的第一个结果,过滤器有600多个结果)。当我按表上的一列查询时,它将返回我期望的所有数据。我做错了什么?

仅返回1个结果应为数百

for row in edb_alchemy.session.query(FtSite).filter(FtSite.serial_si == 200134444):
        print(row.s_sequence)
Run Code Online (Sandbox Code Playgroud)

结果如下:1

返回所有结果

for row in edb_alchemy.session.query(FtSite.s_sequence).filter(FtSite.serial_si == 200134444):
        print(row)
Run Code Online (Sandbox Code Playgroud)

结果看起来像:(1,)(2,)(3,)(4,)...

为FtSite表返回1个结果,为列返回所有结果

for row in edb_alchemy.session.query(FtSite, FtSite.s_sequence).filter(FtSite.serial_si == 200134444):
        print(row.FtSite.s_sequence, row.s_sequence)
Run Code Online (Sandbox Code Playgroud)

结果看起来像(1,1),(1、2),(1、3),(1,4)....

SQLAlchemy说其使用的SQL是

"SELECT ft_site.serial_si AS ft_site_serial_si, ft_site.partition_id AS ft_site_partition_id, ft_site.s_sequence AS ft_site_s_sequence, ft_site.value AS ft_site_value" + \
    " FROM ft_site" + \
    " WHERE ft_site.serial_si = 200134444"
Run Code Online (Sandbox Code Playgroud)

仅在SQLAlchemy之外使用SQL查询时,该方法可以按我预期的那样正常工作。


更新资料

谢谢Ilja的评论。由于某种原因,我认为该表具有ID主键。事实并非如此,我只是这个数据库的使用者,应该更加谨慎。你说的没错。该表没有唯一键,并且在FtSite.serial_si下列出了MUL。

这就是表格的实际外观。

+------------+----------+------+-----+---------+----------------+
| Field      | Type     | Null | Key | Default | Extra          |
+------------+----------+------+-----+---------+----------------+
| p_id       | int(10) …
Run Code Online (Sandbox Code Playgroud)

mysql sqlalchemy

2
推荐指数
1
解决办法
2433
查看次数