Implement SQLite datetime fix
This commit is contained in:
parent
b7bbde45fa
commit
07c290f691
@ -4,6 +4,7 @@ import warnings
|
|||||||
warnings.filterwarnings(
|
warnings.filterwarnings(
|
||||||
'ignore', 'Unicode type received non-unicode bind param value.')
|
'ignore', 'Unicode type received non-unicode bind param value.')
|
||||||
|
|
||||||
|
from dataset.persistence.util import sqlite_datetime_fix
|
||||||
from dataset.persistence.database import Database
|
from dataset.persistence.database import Database
|
||||||
from dataset.persistence.table import Table
|
from dataset.persistence.table import Table
|
||||||
from dataset.freeze.app import freeze
|
from dataset.freeze.app import freeze
|
||||||
@ -27,4 +28,8 @@ def connect(url=None, schema=None, reflectMetadata=True):
|
|||||||
"""
|
"""
|
||||||
if url is None:
|
if url is None:
|
||||||
url = os.environ.get('DATABASE_URL', url)
|
url = os.environ.get('DATABASE_URL', url)
|
||||||
|
|
||||||
|
if url.startswith("sqlite://"):
|
||||||
|
sqlite_datetime_fix()
|
||||||
|
|
||||||
return Database(url, schema=schema, reflectMetadata=reflectMetadata)
|
return Database(url, schema=schema, reflectMetadata=reflectMetadata)
|
||||||
|
|||||||
@ -1,7 +1,7 @@
|
|||||||
from datetime import datetime
|
from datetime import datetime, timedelta
|
||||||
from inspect import isgenerator
|
from inspect import isgenerator
|
||||||
|
|
||||||
from sqlalchemy import Integer, UnicodeText, Float, DateTime, Boolean
|
from sqlalchemy import Integer, UnicodeText, Float, DateTime, Boolean, types, Table, event
|
||||||
|
|
||||||
|
|
||||||
def guess_type(sample):
|
def guess_type(sample):
|
||||||
@ -50,3 +50,20 @@ class ResultIter(object):
|
|||||||
|
|
||||||
def __iter__(self):
|
def __iter__(self):
|
||||||
return self
|
return self
|
||||||
|
|
||||||
|
|
||||||
|
def sqlite_datetime_fix():
|
||||||
|
class SQLiteDateTimeType(types.TypeDecorator):
|
||||||
|
impl = types.Integer
|
||||||
|
epoch = datetime(1970, 1, 1, 0, 0, 0)
|
||||||
|
|
||||||
|
def process_bind_param(self, value, dialect):
|
||||||
|
return (value / 1000 - self.epoch).total_seconds()
|
||||||
|
|
||||||
|
def process_result_value(self, value, dialect):
|
||||||
|
return self.epoch + timedelta(seconds=value / 1000)
|
||||||
|
|
||||||
|
@event.listens_for(Table, "column_reflect")
|
||||||
|
def setup_epoch(inspector, table, column_info):
|
||||||
|
if isinstance(column_info['type'], types.DateTime):
|
||||||
|
column_info['type'] = SQLiteDateTimeType()
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user