Thanks for reply. The reason is simple. I plan in the future to accommodate datetime range into that column as well, so storing this logic as plain strings gives the most flexibility. This is a project that I'm learning by making. So I would like to try all the new features for later tasks.
I'm fascinated by hybrid_property, but is stuck now when trying to dispatch functions at the SQL expression level. Jinghui On Fri, Sep 16, 2016 at 1:34 AM, Simon King <si...@simonking.org.uk> wrote: > Ignore SQLAlchemy for the moment and describe what you are trying to > achieve. It looks like you want to store dates and times as strings in > your database (rather than the appropriate type), and yet still be > able to perform date-related operations on them qhen querying. Is that > right? Is there a reason why you can't store them as proper DateTime > values (perhaps with a second column to indicate whether or not the > time part is valid)? > > Simon > > On Fri, Sep 16, 2016 at 4:39 AM, Jinghui Niu <niujing...@gmail.com> wrote: > > I have the following code snippet, I marked my question in a comment line > > inside the hybrid_property.expression part. As you can see, it is now not > > implemented: > > > > from sqlalchemy.ext.declarative import declared_attr > > from sqlalchemy import Column, Integer, String, Unicode, UnicodeText > > from sqlalchemy.ext.hybrid import hybrid_property, hybrid_method > > import arrow > > > > > > datetimeString_format = { > > "UTC": "%Y-%m-%d %H:%M:%S+00:00", > > "local_with_timezoneMarker": "%Y-%m-%d %H:%M:%S %Z", > > "local_without_timezoneMarker": "%Y-%m-%d %H:%M:%S" > > } > > > > > > dateString_format = "%Y-%m-%d" > > > > > > class My_TimePoint_Mixin: > > # define output formats: > > datetimeString_inUTC_format = "%Y-%m-%d %H:%M:%S+00:00" > > datetimeString_naive_format = "%Y-%m-%d %H:%M:%S" > > > > > > # instrumented fields: > > _TimePoint_in_database = Column('timepoint', String, nullable=False) > > _TimePoint_in_database_suffix = Column( > > 'timepoint_suffix', String, nullable=False) > > > > > > @hybrid_property > > def timepoint(self): > > twoPossibleType_handlers = [ > > self._report_ACCRT_DATE, > > self._report_ACCRT_DATETIME > > ] > > for handler in twoPossibleType_handlers: > > print("handler: ", handler) > > try: > > return handler(self) > > except (AssertionError, ValueError) as e: > > logging.warning("Try next handler!") > > > > @timepoint.expression > > def timepoint(cls): > > pass > > # How can I implement SQL expression for a equivalent function > > dispatch here? There seems to be no SQL equivalent structure for this? > > > > > > @timepoint.setter > > def timepoint(self, datetimepointOBJ): > > handlers_lookup = { > > datetime.datetime: self._set_ACCRT_DATETIME, > > datetime.date: self._set_ACCRT_DATE > > } > > this_time = type(datetimepointOBJ) > > this_handler = handlers_lookup[this_time] > > print("handler: ", this_handler) > > this_handler(datetimepointOBJ) > > > > > > def _report_ACCRT_DATE(self): > > """Accurate Date""" > > assert self._TimePoint_in_database_suffix == "ACCRT_DATE" > > date_string = self._TimePoint_in_database > > dateString_format = "%Y-%m-%d" > > # return a datetime.date > > return datetime.datetime.strptime(date_string, > > dateString_format).date() > > > > > > def _report_ACCRT_DATETIME(self): > > """Accurate DateTime""" > > assert self._TimePoint_in_database_suffix in > pytz.all_timezones_set > > datetimeString_inUTC = self._TimePoint_in_database > > utc_naive = datetime.datetime.strptime( > > datetimeString_inUTC, self.datetimeString_inUTC_format) > > utc_timepoint = arrow.get(utc_naive, "utc") > > # localize > > local_timepoint = > > utc_timepoint.to(self._TimePoint_in_database_suffix) > > # return a datetime.datetime > > return local_timepoint.datetime > > > > > > def _set_ACCRT_DATETIME(self, datetimeOBJ_aware): > > assert isinstance(datetimeOBJ_aware, datetime.datetime), "Must > be a > > valid datetime.datetime!" > > assert datetimeOBJ_aware.tzinfo is not None, "Must contain > tzinfo!" > > utctime_aware_arrow = arrow.get(datetimeOBJ_aware).to('utc') > > utctime_aware_datetime = utctime_aware_arrow.datetime > > store_datetime_string = utctime_aware_datetime.strftime( > > self.datetimeString_inUTC_format) > > self._TimePoint_in_database = store_datetime_string > > > > > > def _set_ACCRT_DATE(self, dateOBJ): > > store_date_string = dateOBJ.isoformat() > > self._TimePoint_in_database = store_date_string > > > > Could someone please point out a clue as to implement the > > hybrid_property.expression part? Thanks. > > > > I've also posted a similar issue on stackoverflow.com, for reference: > > > > http://stackoverflow.com/questions/39485440/calling- > from-the-same-class-why-is-one-treated-as-bound-method-while-the-other > > > > -- > > You received this message because you are subscribed to the Google Groups > > "sqlalchemy" group. > > To unsubscribe from this group and stop receiving emails from it, send an > > email to sqlalchemy+unsubscr...@googlegroups.com. > > To post to this group, send email to sqlalchemy@googlegroups.com. > > Visit this group at https://groups.google.com/group/sqlalchemy. > > For more options, visit https://groups.google.com/d/optout. > > -- > You received this message because you are subscribed to a topic in the > Google Groups "sqlalchemy" group. > To unsubscribe from this topic, visit https://groups.google.com/d/ > topic/sqlalchemy/i8k2u7bK5x4/unsubscribe. > To unsubscribe from this group and all its topics, send an email to > sqlalchemy+unsubscr...@googlegroups.com. > To post to this group, send email to sqlalchemy@googlegroups.com. > Visit this group at https://groups.google.com/group/sqlalchemy. > For more options, visit https://groups.google.com/d/optout. > -- You received this message because you are subscribed to the Google Groups "sqlalchemy" group. To unsubscribe from this group and stop receiving emails from it, send an email to sqlalchemy+unsubscr...@googlegroups.com. To post to this group, send email to sqlalchemy@googlegroups.com. Visit this group at https://groups.google.com/group/sqlalchemy. For more options, visit https://groups.google.com/d/optout.