我正在使用烧瓶棉花糖(棉花糖=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这个异常 …
更新-下面的解决方案
我对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)