1414import abc
1515import collections
1616import time
17+ import datetime
1718from future .utils import with_metaclass
1819from itertools import islice
1920
@@ -201,6 +202,10 @@ def __cmp__(self, other):
201202
202203
203204class ParamEscaper (object ):
205+ _DATE_FORMAT = "%Y-%m-%d"
206+ _TIME_FORMAT = "%H:%M:%S.%f"
207+ _DATETIME_FORMAT = "{} {}" .format (_DATE_FORMAT , _TIME_FORMAT )
208+
204209 def escape_args (self , parameters ):
205210 if isinstance (parameters , dict ):
206211 return {k : self .escape_item (v ) for k , v in parameters .items ()}
@@ -228,6 +233,11 @@ def escape_sequence(self, item):
228233 l = map (str , map (self .escape_item , item ))
229234 return '(' + ',' .join (l ) + ')'
230235
236+ def escape_datetime (self , item , format , cutoff = 0 ):
237+ dt_str = item .strftime (format )
238+ formatted = dt_str [:- cutoff ] if cutoff and format .endswith (".%f" ) else dt_str
239+ return "'{}'" .format (formatted )
240+
231241 def escape_item (self , item ):
232242 if item is None :
233243 return 'NULL'
@@ -237,6 +247,10 @@ def escape_item(self, item):
237247 return self .escape_string (item )
238248 elif isinstance (item , collections .Iterable ):
239249 return self .escape_sequence (item )
250+ elif isinstance (item , datetime .datetime ):
251+ return self .escape_datetime (item , self ._DATETIME_FORMAT )
252+ elif isinstance (item , datetime .date ):
253+ return self .escape_datetime (item , self ._DATE_FORMAT )
240254 else :
241255 raise exc .ProgrammingError ("Unsupported object {}" .format (item ))
242256
0 commit comments