gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 01:20:19 27 4
gpt4 key购买 nike

更新 - 下面的解决方案

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

只返回 1 个结果应该是数百个

for row in edb_alchemy.session.query(FtSite).filter(FtSite.serial_si == 200134444):
print(row.s_sequence)

结果如下:1

返回所有结果

for row in edb_alchemy.session.query(FtSite.s_sequence).filter(FtSite.serial_si == 200134444):
print(row)

结果如下:(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)

结果看起来像(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"

当仅在 SQLAlchemy 之外使用 SQL 查询时,效果如我所料。


更新

谢谢 Ilja 的评论。出于某种原因,我认为这张表有一个 id 主键。它没有,我只是这个数据库的消费者,应该更加细心。你是对的。此表没有唯一键,并在 FtSite.serial_si 下列出了 MUL。

这就是表格的实际样子。

+------------+----------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+------------+----------+------+-----+---------+----------------+
| p_id | int(10) | NO | | NULL | |
| serial_si | int(10) | NO | MUL | NULL | |
| s_sequence | int(10) | NO | | NULL | |
| value | double | YES | | NULL | |
+------------+----------+------+-----+---------+----------------+

我原来的表描述是

class FtSite(Base):
__tablename__ = "ft_site"

id = Column(INTEGER, primary_key=True)
serial_si = Column(INTEGER)
partition_id = Column(INTEGER)
s_sequence = Column(INTEGER)
value = Column(DOUBLE)

我将其更改为在 SQLAlchemy 中有一个复合键 (s_sequence, serial_si) 是唯一的,即使它没有在数据库中定义也是如此。这是在 SQLAlchemy 中处理此问题的最佳方法吗?它现在返回预期结果。

class FtSite(Base):
__tablename__ = "ft_site"

serial_si = Column(INTEGER, primary_key=True)
partition_id = Column(INTEGER)
s_sequence = Column(INTEGER, primary_key=True)
value = Column(DOUBLE)

最佳答案

我遇到了类似的情况,SQLAlchemy 查询对象的 .all() 没有返回表中的所有行(总是缺少一些)但是 .count() 通话确实给出了正确的计数。在深入研究之后,我意识到模型声明偏离了该数据库中的实际表模式。首先,数据库在模式中有一个主键列,但模型声明有一个组合主键(与你的情况相反),而且我错过了一个 3 列唯一约束,因为表模式有它。

在我的案例中发生的事情是,每当 SQL Alchemy 查询数据库时,它确实获得了幕后的所有行,但是由于我的模型声明中的主键组成不正确,阻止了一些行加载到 SQLAlchemy 的 session 中(主键由定义唯一标识对象,因此它不会在 session 中加载具有相同主键的两个对象,因此它会丢弃那些具有相同值的组合列,即使在数据库中它们确实具有不同的 PK。)

总而言之,仔细检查模型声明与数据库架构以确保它们同步是此类问题的第一 react 。

关于mysql - SqlAlchemy 在查询表对象时不返回所有行,但在查询表对象列时返回所有行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38495291/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com