Как добавить функцию SQL в sqlalchemy - PullRequest
0 голосов
/ 06 ноября 2018

Я работаю с 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 пару миллионов или просто пару записей.

Ответы [ 2 ]

0 голосов
/ 07 июня 2019

Старый вопрос, но вы также можете использовать SQL и общие функции sqlachemy: https://docs.sqlalchemy.org/en/13/core/functions.html

0 голосов
/ 07 ноября 2018

Попробовав несколько вещей, я понял, что hybrid_property не должен возвращать выражение sql, ему нужно возвращать фактическое значение, которое возвращало бы выражение sql. Это значит, что моя sql-функция войдет в часть 'expression' hybrid_property, которая будет выглядеть следующим образом:

@weekday.expression
def weekday(cls):
  return weekday(cls.asof)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...