Last active
September 16, 2021 10:15
-
-
Save simsicon/1d146ef0dc285e08d3687367343ac7a2 to your computer and use it in GitHub Desktop.
Sqlalchemy subquery is cached, the result is incorrect respect to the different parameters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
from sqlalchemy import create_engine, select, func, text | |
from sqlalchemy.orm import sessionmaker, declarative_base | |
from sqlalchemy import Column, Integer, Date | |
import datetime | |
#SQLAlchemy==1.4.23 psycopg2==2.9.1 with postgresql 13 | |
engine = create_engine("postgresql+psycopg2://postgres:[email protected]:5432/sa_test?sslmode=disable", echo=False) | |
Session = sessionmaker(engine) | |
Base = declarative_base() | |
class CalendarDate(Base): | |
__tablename__ = 'calendar_date' | |
dt = Column(Date, primary_key=True) | |
value = Column(Integer) | |
Base.metadata.create_all(engine) | |
def prepare_test_data(n: int): | |
today = datetime.datetime.today() | |
with Session() as session: | |
session.query(CalendarDate).delete() | |
for i in range(n): | |
_date = today - datetime.timedelta(days=i) | |
session.add(CalendarDate(dt=_date, value=i)) | |
session.commit() | |
if __name__ == '__main__': | |
prepare_test_data(100) | |
offsets = [5, 15, 30] | |
for offset in offsets: | |
with Session() as session: | |
sub_stmt = select(CalendarDate).where( | |
CalendarDate.value < 1000 | |
).order_by(CalendarDate.dt.desc()).limit(offset).subquery | |
stmt = select(func.min(text("dt"))).select_from(sub_stmt) | |
print(session.execute(stmt).scalars().one_or_none()) | |
# output is the same, offset is cached | |
# 2021-09-12 | |
# 2021-09-12 | |
# 2021-09-12 | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment