Use ciso8601 for parsing datetimes with sqlalchemy sqlite dialect (#71766)

This commit is contained in:
J. Nick Koston 2022-05-12 20:11:43 -04:00 committed by GitHub
parent d76ff7d5a2
commit 8ab27f26b9
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -6,6 +6,7 @@ import json
import logging import logging
from typing import Any, TypedDict, cast, overload from typing import Any, TypedDict, cast, overload
import ciso8601
from fnvhash import fnv1a_32 from fnvhash import fnv1a_32
from sqlalchemy import ( from sqlalchemy import (
BigInteger, BigInteger,
@ -22,7 +23,7 @@ from sqlalchemy import (
Text, Text,
distinct, distinct,
) )
from sqlalchemy.dialects import mysql, oracle, postgresql from sqlalchemy.dialects import mysql, oracle, postgresql, sqlite
from sqlalchemy.engine.row import Row from sqlalchemy.engine.row import Row
from sqlalchemy.ext.declarative import declared_attr from sqlalchemy.ext.declarative import declared_attr
from sqlalchemy.orm import declarative_base, relationship from sqlalchemy.orm import declarative_base, relationship
@ -91,8 +92,18 @@ TABLES_TO_CHECK = [
EMPTY_JSON_OBJECT = "{}" EMPTY_JSON_OBJECT = "{}"
DATETIME_TYPE = DateTime(timezone=True).with_variant( class FAST_PYSQLITE_DATETIME(sqlite.DATETIME): # type: ignore[misc]
mysql.DATETIME(timezone=True, fsp=6), "mysql" """Use ciso8601 to parse datetimes instead of sqlalchemy built-in regex."""
def result_processor(self, dialect, coltype): # type: ignore[no-untyped-def]
"""Offload the datetime parsing to ciso8601."""
return lambda value: None if value is None else ciso8601.parse_datetime(value)
DATETIME_TYPE = (
DateTime(timezone=True)
.with_variant(mysql.DATETIME(timezone=True, fsp=6), "mysql")
.with_variant(FAST_PYSQLITE_DATETIME(), "sqlite")
) )
DOUBLE_TYPE = ( DOUBLE_TYPE = (
Float() Float()