diff options
author | Alex Grönholm <alex.gronholm@nextday.fi> | 2014-07-07 06:42:45 +0300 |
---|---|---|
committer | Alex Grönholm <alex.gronholm@nextday.fi> | 2014-07-07 06:42:45 +0300 |
commit | 8e8c6676239ec91729b79a34a1a6c652b89cfbd7 (patch) | |
tree | 342ccb0a7eea796c184604690d0dcc84061dadcd | |
parent | d8f1f96ee1dfbec9389ac5f760519c6da1405e0d (diff) | |
download | apscheduler-8e8c6676239ec91729b79a34a1a6c652b89cfbd7.tar.gz |
Use Float instead of BigInteger in SQLAlchemyJobStore to maintain proper job order in cases where next run times differ by less than a second (fixes #63)
-rw-r--r-- | apscheduler/jobstores/sqlalchemy.py | 6 | ||||
-rw-r--r-- | tests/test_jobstores.py | 8 |
2 files changed, 11 insertions, 3 deletions
diff --git a/apscheduler/jobstores/sqlalchemy.py b/apscheduler/jobstores/sqlalchemy.py index 2a13ad5..4e0c0e2 100644 --- a/apscheduler/jobstores/sqlalchemy.py +++ b/apscheduler/jobstores/sqlalchemy.py @@ -10,7 +10,7 @@ except ImportError: # pragma: nocover import pickle try: - from sqlalchemy import create_engine, Table, Column, MetaData, Unicode, BigInteger, LargeBinary, select + from sqlalchemy import create_engine, Table, Column, MetaData, Unicode, Float, LargeBinary, select from sqlalchemy.exc import IntegrityError except ImportError: # pragma: nocover raise ImportError('SQLAlchemyJobStore requires SQLAlchemy installed') @@ -44,11 +44,11 @@ class SQLAlchemyJobStore(BaseJobStore): else: raise ValueError('Need either "engine" or "url" defined') - # 767 = max key length in MySQL for InnoDB tables + # 767 = max key length in MySQL for InnoDB tables, 25 = precision that translates to an 8-byte float self.jobs_t = Table( tablename, metadata, Column('id', Unicode(767, _warn_on_bytestring=False), primary_key=True), - Column('next_run_time', BigInteger, index=True), + Column('next_run_time', Float(25), index=True), Column('job_state', LargeBinary, nullable=False) ) diff --git a/tests/test_jobstores.py b/tests/test_jobstores.py index 191d4fd..58e8533 100644 --- a/tests/test_jobstores.py +++ b/tests/test_jobstores.py @@ -114,6 +114,14 @@ def test_get_pending_jobs(jobstore, create_add_job, timezone): assert jobs == [] +def test_get_pending_jobs_subsecond_difference(jobstore, create_add_job, timezone): + job1 = create_add_job(jobstore, dummy_job, datetime(2014, 7, 7, 0, 0, 0, 401)) + job2 = create_add_job(jobstore, dummy_job2, datetime(2014, 7, 7, 0, 0, 0, 402)) + job3 = create_add_job(jobstore, dummy_job3, datetime(2014, 7, 7, 0, 0, 0, 400)) + jobs = jobstore.get_due_jobs(timezone.localize(datetime(2014, 7, 7, 1))) + assert jobs == [job3, job1, job2] + + def test_get_next_run_time(jobstore, create_add_job, timezone): create_add_job(jobstore, dummy_job, datetime(2016, 5, 3)) create_add_job(jobstore, dummy_job2, datetime(2014, 2, 26)) |