Я работаю с Oracle SQL и хочу использовать некоторые функции Oracle, которых нет в других типах реляционных баз данных.
В основном я хочу добавить функцию, которая возвращает день недели для данной даты.
Из того, что я понимаю, sqlachemy дает мне два способа сделать это: один - предоставить sql-запрос в виде текста, другой - расширение sqlalchemy, реализующее новую функцию python, представляющую функцию SQL. Я склоняюсь к реализации этой функции, потому что ожидаю использовать ее в нескольких запросах.
Вот то, что я реализовал до сих пор, чтобы сделать это, я не совсем уверен, каков мой следующий шаг, или если это даже правильно.
from sqlalchemy.sql.expression import FunctionElement
from sqlalchemy.ext.compiler import compiles
class weekday(FunctionElement):
name= 'weekday'
@compiles(weekday)
def complie(element, compiler, **kw):
if len(element.clauses) == 1:
return "TO_CHAR(%s,'DY')" % compiler.process(element.clauses)
elif len(element.clauses) == 0:
raise TypeError("Weekday needs a date as parameter")
else:
raise TypeError("Weekday needs just one parameter")
Когда я попытался добавить эту функцию для одного из моих объектов вместо того, чтобы суммировать результаты, я вернул функцию istelf, вот пример того, о чем я говорю:
from sqlalchemy import Column, Date
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.ext.hybrid import hybrid_property
class SomeObject(Base):
__tablename__ = 'table1'
asof = Column(Date,primary_key=True)
@hybrid_property
def weekday(self):
return weekday(self.asof)
В оболочке я пробовал:
from datetime import datetime
my_object = SomeObject()
my_object.asof = datetime(2018,1,1)
session.add(my_object)
session.commit()
result = session.query(SomeObject).filter(SomeObject.asof == datetime(2018,1,1)).first()
result.weekday # returns `<orm.weekday as 0x1724b7deeb8; weekday>`
Примечание
Я настаиваю на извлечении этого дня недели в SQL-запросе, а не в python, потому что мне это нужно для фильтрации некоторых записей, и в моем случае эта функция будет определять, вытаскивает ли sqlalchemy пару миллионов или просто пару записей.