First of all, thank you for your time and feedback. I really apologize for my inattention. The problem wasn't related with sqlalchemy or python/sql timezones. I run raw sql query using Pycharm + Database console <https://www.jetbrains.com/help/pycharm/database-console.html>. The results using *database console* and *psql* in docker container are different.
<https://lh3.googleusercontent.com/-18asnuj5Du4/Wz4o33WJV3I/AAAAAAAAAKY/Ij0OXJMr4CUYiIVBipTqz7A6OA7nrT_WACLcBGAs/s1600/Screen%2BShot%2B2018-07-05%2Bat%2B5.15.28%2BPM.png> <https://lh3.googleusercontent.com/-wLNQbg6MyJ8/Wz4o7Z_oJjI/AAAAAAAAAKc/B4omNeIoGGAKMgWZhT4mkZLF83xALwiSQCLcBGAs/s1600/Screen%2BShot%2B2018-07-05%2Bat%2B5.18.40%2BPM.png> So it was my mistake. Thank you one more time. On Friday, June 29, 2018 at 6:45:01 PM UTC+3, Mike Bayer wrote: > check that the timezones are matching up, e.g. that your python times > aren't X hours off from the PG one, stuff like that > > On Fri, Jun 29, 2018 at 11:44 AM, Mike Bayer <mik...@zzzcomputing.com > <javascript:>> wrote: > > you need to look at the SQL output and the results and additionally > > log in to the psql command line and check individual elements of what > > you are doing. like what the current time is from now(), what are > > the rows in the table without any WHERE criterion, etc. > > > > > > On Fri, Jun 29, 2018 at 11:41 AM, Danila Ganchar > > <danila....@gmail.com <javascript:>> wrote: > >> Thank you for your feedback. I apologize for perseverance. > >> I understand the difference between python now() and db now(). > >> Why I didn't use sleep() in previous example? Because when I run the > script > >> again a few seconds has already passed. And I should see at least one > or two > >> record. > >> > >> I checked your script. In my case I got the error: > >> > >> Traceback (most recent call last): > >> File "path_to_test.py", line 45, in <module> > >> assert len(with_error.all()) == 10 > >> AssertionError > >> > >> I checked one more time. My docker-compose: > >> > >> version: '2' > >> services: > >> db: > >> image: postgres > >> ports: > >> - "5432:5432" > >> environment: > >> POSTGRES_DB: test > >> POSTGRES_USER: postgres > >> POSTGRES_PASSWORD: postgres > >> restart: always > >> > >> > >> My script: > >> > >> import datetime > >> > >> from sqlalchemy import * > >> from sqlalchemy.ext.declarative import declarative_base > >> from sqlalchemy.orm import * > >> > >> Base = declarative_base() > >> > >> > >> class User(Base): > >> __tablename__ = 'test_user' > >> > >> id = Column(Integer, primary_key=True) > >> timeout = Column(Integer) > >> last_receive_time = Column(TIMESTAMP) > >> > >> e = create_engine("postgresql://postgres:postgres@localhost:5432/test", > >> echo='debug') > >> Base.metadata.drop_all(e) > >> Base.metadata.create_all(e) > >> > >> session = Session(e) > >> for i in range(10): > >> session.add( User( timeout=1, > last_receive_time=datetime.datetime.now() > >> )) > >> > >> session.commit() > >> > >> import time > >> time.sleep(1) > >> > >> correct = session.query(User)\ > >> .from_statement(text(""" > >> SELECT * > >> FROM test_user > >> WHERE (last_receive_time + INTERVAL '1 second' * timeout) < > :now > >> """)).params(now=datetime.datetime.now()) > >> > >> assert len(correct.all()) == 10 > >> > >> with_error = session.query(User)\ > >> .from_statement(text(""" > >> SELECT * > >> FROM test_user > >> WHERE (last_receive_time + INTERVAL '1 second' * timeout) < > NOW() > >> """)) > >> > >> assert len(with_error.all()) == 10 > >> > >> > >> What I doing wrong? Sorry but it's really strange. > >> > >> On Wednesday, June 27, 2018 at 7:06:04 PM UTC+3, Mike Bayer wrote: > >>> > >>> I apologize for my inpatient tone in my previous email. I would hope > >>> that everyone in this mailing list feels welcome. > >>> > >>> On Wed, Jun 27, 2018, 10:59 AM Mike Bayer <mik...@zzzcomputing.com> > wrote: > >>>> > >>>> this is a very simple issue to debug with basic programming > >>>> techniques, first off, put echo='debug' in your create_engine so you > >>>> can see all SQL and results: > >>>> > >>>> e = create_engine("postgresql://scott:tiger@localhost/test", > >>>> echo='debug') > >>>> > >>>> > >>>> next, if you are running over to a SQL command line vs. running a > >>>> program, the big difference is that *time has passed*. Put a sleep > in > >>>> your program and there is your row: > >>>> > >>>> from sqlalchemy import * > >>>> from sqlalchemy.orm import * > >>>> from sqlalchemy.ext.declarative import declarative_base > >>>> from sqlalchemy.ext.declarative import declared_attr > >>>> import datetime > >>>> > >>>> Base = declarative_base() > >>>> > >>>> class User(Base): > >>>> __tablename__ = 'test_user' > >>>> > >>>> id = Column(Integer, primary_key=True) > >>>> timeout = Column(Integer) > >>>> last_receive_time = Column(TIMESTAMP) > >>>> > >>>> e = create_engine("postgresql://scott:tiger@localhost/test", > >>>> echo='debug') > >>>> Base.metadata.drop_all(e) > >>>> Base.metadata.create_all(e) > >>>> > >>>> session = Session(e) > >>>> for i in range(10): > >>>> session.add( User( timeout=1, > >>>> last_receive_time=datetime.datetime.now() )) > >>>> > >>>> session.commit() > >>>> > >>>> import time > >>>> time.sleep(1) > >>>> > >>>> query = session.query(User)\ > >>>> .from_statement(text(""" > >>>> SELECT * > >>>> FROM test_user > >>>> WHERE (last_receive_time + INTERVAL '1 second' * timeout) < > NOW() > >>>> """)) > >>>> > >>>> assert len(query.all()) == 10 > >>>> > >>>> > >>>> > >>>> On Wed, Jun 27, 2018 at 6:30 AM, Danila Ganchar > >>>> <danila....@gmail.com> wrote: > >>>> > Ok. I ran the script 10 times on a clean table. > >>>> > Now I run raw sql: > >>>> > > >>>> > SELECT * > >>>> > FROM test_user > >>>> > WHERE (last_receive_time + INTERVAL '1 second' * timeout) < NOW(); > >>>> > > >>>> > The result: 10 records. > >>>> > Now I run script one more time. Still 0 records using > from_statement. > >>>> > > >>>> > amount records using NOW() = 0 > >>>> > > >>>> > As I understand it, is this correct? This is just unclear because > >>>> > from_statement + text works not like raw query. > >>>> > > >>>> > On Tue, Jun 26, 2018 at 7:42 PM, Mike Bayer < > mik...@zzzcomputing.com> > >>>> > wrote: > >>>> >> > >>>> >> definitely, triyng to match up python .now() with database .now() > is > >>>> >> not going to work, in particular since .now() in the database is > often > >>>> >> the transaction start time, not the actual time. > >>>> >> > >>>> >> On Tue, Jun 26, 2018 at 12:28 PM, Jonathan Vanasco > >>>> >> <jona...@findmeon.com> wrote: > >>>> >> > the difference is possibly because this is calculated in Python, > >>>> >> > each > >>>> >> > time > >>>> >> > it is executed: > >>>> >> > > >>>> >> > datetime.datetime.now() > >>>> >> > > >>>> >> > this is calculated in Postgres, and refers to the beginning of > the > >>>> >> > transaction; it does not change across the transaction. > >>>> >> > > >>>> >> > NOW() > >>>> >> > > >>>> >> > -- > >>>> >> > SQLAlchemy - > >>>> >> > The Python SQL Toolkit and Object Relational Mapper > >>>> >> > > >>>> >> > http://www.sqlalchemy.org/ > >>>> >> > > >>>> >> > To post example code, please provide an MCVE: Minimal, Complete, > and > >>>> >> > Verifiable Example. See http://stackoverflow.com/help/mcve for > a > >>>> >> > full > >>>> >> > description. > >>>> >> > --- > >>>> >> > You received this message because you are subscribed to the > Google > >>>> >> > Groups > >>>> >> > "sqlalchemy" group. > >>>> >> > To unsubscribe from this group and stop receiving emails from > it, > >>>> >> > send > >>>> >> > an > >>>> >> > email to sqlalchemy+...@googlegroups.com. > >>>> >> > To post to this group, send email to sqlal...@googlegroups.com. > >>>> >> > Visit this group at https://groups.google.com/group/sqlalchemy. > >>>> >> > For more options, visit https://groups.google.com/d/optout. > >>>> >> > >>>> >> -- > >>>> >> SQLAlchemy - > >>>> >> The Python SQL Toolkit and Object Relational Mapper > >>>> >> > >>>> >> http://www.sqlalchemy.org/ > >>>> >> > >>>> >> To post example code, please provide an MCVE: Minimal, Complete, > and > >>>> >> Verifiable Example. See http://stackoverflow.com/help/mcve for > a > >>>> >> full > >>>> >> description. > >>>> >> --- > >>>> >> You received this message because you are subscribed to the Google > >>>> >> Groups > >>>> >> "sqlalchemy" group. > >>>> >> To unsubscribe from this group and stop receiving emails from it, > send > >>>> >> an > >>>> >> email to sqlalchemy+...@googlegroups.com. > >>>> >> To post to this group, send email to sqlal...@googlegroups.com. > >>>> >> Visit this group at https://groups.google.com/group/sqlalchemy. > >>>> >> For more options, visit https://groups.google.com/d/optout. > >>>> > > >>>> > > >>>> > -- > >>>> > SQLAlchemy - > >>>> > The Python SQL Toolkit and Object Relational Mapper > >>>> > > >>>> > http://www.sqlalchemy.org/ > >>>> > > >>>> > To post example code, please provide an MCVE: Minimal, Complete, > and > >>>> > Verifiable Example. See http://stackoverflow.com/help/mcve for a > full > >>>> > description. > >>>> > --- > >>>> > You received this message because you are subscribed to the Google > >>>> > Groups > >>>> > "sqlalchemy" group. > >>>> > To unsubscribe from this group and stop receiving emails from it, > send > >>>> > an > >>>> > email to sqlalchemy+...@googlegroups.com. > >>>> > To post to this group, send email to sqlal...@googlegroups.com. > >>>> > Visit this group at https://groups.google.com/group/sqlalchemy. > >>>> > For more options, visit https://groups.google.com/d/optout. > >> > >> -- > >> SQLAlchemy - > >> The Python SQL Toolkit and Object Relational Mapper > >> > >> http://www.sqlalchemy.org/ > >> > >> To post example code, please provide an MCVE: Minimal, Complete, and > >> Verifiable Example. See http://stackoverflow.com/help/mcve for a full > >> description. > >> --- > >> You received this message because you are subscribed to the Google > Groups > >> "sqlalchemy" group. > >> To unsubscribe from this group and stop receiving emails from it, send > an > >> email to sqlalchemy+...@googlegroups.com <javascript:>. > >> To post to this group, send email to sqlal...@googlegroups.com > <javascript:>. > >> Visit this group at https://groups.google.com/group/sqlalchemy. > >> For more options, visit https://groups.google.com/d/optout. > -- SQLAlchemy - The Python SQL Toolkit and Object Relational Mapper http://www.sqlalchemy.org/ To post example code, please provide an MCVE: Minimal, Complete, and Verifiable Example. See http://stackoverflow.com/help/mcve for a full description. --- You received this message because you are subscribed to the Google Groups "sqlalchemy" group. To unsubscribe from this group and stop receiving emails from it, send an email to sqlalchemy+unsubscr...@googlegroups.com. To post to this group, send email to sqlalchemy@googlegroups.com. Visit this group at https://groups.google.com/group/sqlalchemy. For more options, visit https://groups.google.com/d/optout.