diff options
author | Gord Thompson <gord@gordthompson.com> | 2020-02-03 16:42:45 -0700 |
---|---|---|
committer | Mike Bayer <mike_mp@zzzcomputing.com> | 2020-02-10 17:48:10 -0500 |
commit | 532ddb0fa717bc10c3a95b7ddf3a60bbfad7ac56 (patch) | |
tree | 71abf19dad4545e0a8d5916c7891bc576b01a3fc /lib/sqlalchemy/dialects/mssql/pyodbc.py | |
parent | fd4df2c456c142e4d6adc317a2941c026b92c4f1 (diff) | |
download | sqlalchemy-532ddb0fa717bc10c3a95b7ddf3a60bbfad7ac56.tar.gz |
Fix handling of None as parameter for a datetimeoffset column
Fixed issue where the :class:`.mssql.DATETIMEOFFSET` type would not
accommodate for the ``None`` value, introduced as part of the series of
fixes for this type first introduced in :ticket:`4983`, :ticket:`5045`.
Additionally, added support for passing a backend-specific date formatted
string through this type, as is typically allowed for date/time types on
most other DBAPIs.
Fixes: #5132
Change-Id: Iab05d67382e0f550474d50e0c3c1c888521b678a
Diffstat (limited to 'lib/sqlalchemy/dialects/mssql/pyodbc.py')
-rw-r--r-- | lib/sqlalchemy/dialects/mssql/pyodbc.py | 19 |
1 files changed, 15 insertions, 4 deletions
diff --git a/lib/sqlalchemy/dialects/mssql/pyodbc.py b/lib/sqlalchemy/dialects/mssql/pyodbc.py index 879fe9a2a..4ba3a0dfa 100644 --- a/lib/sqlalchemy/dialects/mssql/pyodbc.py +++ b/lib/sqlalchemy/dialects/mssql/pyodbc.py @@ -234,10 +234,21 @@ class _ms_binary_pyodbc(object): class _ODBCDateTimeOffset(DATETIMEOFFSET): def bind_processor(self, dialect): def process(value): - """Convert to string format required by T-SQL.""" - dto_string = value.strftime("%Y-%m-%d %H:%M:%S.%f %z") - # offset needs a colon, e.g., -0700 -> -07:00 - return dto_string[:30] + ":" + dto_string[30:] + if value is None: + return None + elif isinstance(value, util.string_types): + # if a string was passed directly, allow it through + return value + else: + # Convert to string format required by T-SQL + dto_string = value.strftime("%Y-%m-%d %H:%M:%S.%f %z") + # offset needs a colon, e.g., -0700 -> -07:00 + # "UTC offset in the form (+-)HHMM[SS[.ffffff]]" + # backend currently rejects seconds / fractional seconds + dto_string = re.sub( + r"([\+\-]\d{2})([\d\.]+)$", r"\1:\2", dto_string + ) + return dto_string return process |