Skip to content

Instantly share code, notes, and snippets.

@simsicon
Last active September 16, 2021 10:15
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save simsicon/1d146ef0dc285e08d3687367343ac7a2 to your computer and use it in GitHub Desktop.
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
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:postgres@127.0.0.1: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