【问题标题】:SQLAlchemy query not iterating over all results from a querySQLAlchemy 查询未迭代查询的所有结果
【发布时间】:2019-02-12 17:13:11
【问题描述】:

我遇到了一些奇怪的行为,因为 SQLAlchemy 没有遍历查询的所有结果。

例如,我有以下python代码:

engine = create_engine(<connection string>)
Session = sessionmaker(bind=engine)
session = Session() 

columns = session.query(Column)

counter = 1
for c in columns
    print(counter)
    counter = counter + 1

print('count: ' + str(columns.count()))

其中 Column 是我以通常的 SQLAlchemy 方式定义和映射的类:

from base import Base
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column, Integer, String, Boolean

class Column(Base):
    __tablename__ = 'COLUMNS'
    __table_args__ = {'schema' : 'INFORMATION_SCHEMA'}

    table_catalog = Column(String)
    table_schema = Column(String)
    table_name = Column(String)
    column_name = Column(String, primary_key=True)
    data_type = Column(String)

根据我的查询,我期望返回 7034 行,这就是最终打印语句打印出来的内容(for columns.count()),但 for 循环最多只能打印 2951 个计数器。

如果我在 for 循环中对返回的数据执行任何其他操作,则只会处理 2951,而不是所有 7034。

有谁知道我为什么会遇到这种差异,以及如何迭代所有 7034 行,而不仅仅是 2951?

【问题讨论】:

  • @AokiAhishatsu 我有,我可以访问查询返回的数据而不会出错,只是 for 循环不会遍历所有数据
  • 你能用 SQL 写你的查询吗?
  • @AokiAhishatsu 是的,查询实际上是“从表中选择 *”
  • @AokiAhishatsu 刚试过,结果一样
  • @AokiAhishatsu print(len(columns)) 无效,它给出错误:'Query' 类型的对象没有 len()

标签: python sqlalchemy


【解决方案1】:

我已经弄清楚为什么我没有得到预期的结果(我做了一些愚蠢的事情)。

Column 类映射到的表中的“column_name”字段不是唯一的,因此选择它作为主键只过滤掉唯一值 - 因为存在重复导致返回的行数少于我的预期。

我通过将列映射的定义更新为:

from base import Base
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column, Integer, String, Boolean

class Column(Base):
    __tablename__ = 'COLUMNS'
    __table_args__ = {'schema' : 'INFORMATION_SCHEMA'}

    table_catalog = Column(String, primary_key=True)
    table_schema = Column(String, primary_key=True)
    table_name = Column(String, primary_key=True)
    column_name = Column(String, primary_key=True)
    data_type = Column(String)

【讨论】:

  • 是的,我正要评论这些内容:) 不错的发现!
  • 感谢您的帮助
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-11
  • 1970-01-01
  • 2017-09-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多