SQLAlchemy запрос не перебирает все результаты запроса - PullRequest
0 голосов
/ 12 февраля 2019

Я испытываю странное поведение, когда 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 строки, и это то, что выводит окончательный оператор print (дляcolumns.count ()), но цикл for получает только до 2951 счетчика печати. ​​

Если я сделаю что-нибудь еще с возвращенными данными в цикле for, обработается только 2951, а не все 7034.

Кто-нибудь знает, почему я испытываю это несоответствие, и как я могу перебрать все 7034 строки, а не только 2951?

1 Ответ

0 голосов
/ 12 февраля 2019

Я понял, почему я не получил ожидаемых результатов (я сделал что-то глупое).

Поле 'column_name' в таблице, в которой класс Column отображается не уникально,поэтому при выборе его в качестве первичного ключа отфильтровываются только уникальные значения - что из-за наличия дубликатов приводит к меньшему количеству возвращаемых строк, чем я ожидал.

Я исправил его, обновив определение сопоставления столбца до:

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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...