SQLAlchemy эквивалент фильтра отношений Django ORM - PullRequest
2 голосов
/ 02 февраля 2012

Этот пример взят из документации Django .

Учитывая модель базы данных (Django):

class Blog(models.Model):
    name = models.CharField(max_length=100)

class Entry(models.Model):
    blog = models.ForeignKey(Blog)
    headline = models.CharField(max_length=255)
    body_text = models.TextField()

В Django я могу использовать:

Entry.objects.filter(blog__name__exact='Beatles Blog')

для получения всех Entry объектов для блогов с указанным именем.

Вопрос : Что такое эквивалентное утверждение SQLAlchemy, учитывая приведенное ниже определение модели?

class Blog(Base):
    __tablename__ = "blog"
    id = Column(Integer, primary_key=True)
    name = Column(Unicode(100))

class Entry(Base):
    __tablename__ = "entry"
    id = Column(Integer, primary_key=True)
    blogid = Column(Integer, ForeignKey(Blog.id))
    headline = Column(Unicode(255))
    body_text = Column(UnicodeText)

    blog = relationship(Blog, backref="entries")

EDIT

Я считаю, что есть два способа сделать это:

>>> q = session.query
>>> print q(Entry).join(Blog).filter(Blog.name == u"One blog")
SELECT entry.id AS entry_id, entry.blogid AS entry_blogid, entry.headline AS entry_headline, entry.body_text AS entry_body_text 
FROM entry JOIN blog ON blog.id = entry.blogid 
WHERE blog.name = ?

>>> print q(Entry).filter(Entry.blog.has(Blog.name == u"One blog"))
SELECT entry.id AS entry_id, entry.blogid AS entry_blogid, entry.headline AS entry_headline, entry.body_text AS entry_body_text 
FROM entry 
WHERE EXISTS (SELECT 1 
FROM blog 
WHERE blog.id = entry.blogid AND blog.name = ?)

# ... and of course
>>> blog = q(Blog).filter(Blog.name == u"One blog")
>>> q(Entry).filter(Entry.blog == blog)

Еще несколько вопросов:

  1. Есть ли другие способы сделать это с помощью SQLAlchemy, кроме указанных выше?
  2. Разве не имеет смысла, если бы вы могли делать session.query(Entry).filter(Entry.blog.name == u"One blog") в отношениях многих к одному?
  3. Какой SQL в этом случае генерирует ORM Джанго?

Ответы [ 3 ]

1 голос
/ 30 марта 2017

Уже поздно на вечеринку, но я наткнулся на это:
https://github.com/mitsuhiko/sqlalchemy-django-query/blob/master/sqlalchemy_django_query.py

Это пытается построить запросы, используя нотацию django.

Из документов: Post.query.filter_by(pub_date__year=2008)

1 голос
/ 03 апреля 2017

Я также всегда мечтал о Django-подобных "магических соединениях".Я знаком с sqlalchemy-django-query, я обнаружил, что он недостаточно мощный для моих задач.

Вот почему я создал https://github.com/absent1706/sqlalchemy-mixins#django-like-queries.

Он работает аналогичноsqlalchemy-django-query, но имеет больше дополнительных функций ( вот сравнение ).Также это хорошо проверено и задокументировано.

1 голос
/ 02 февраля 2012

Как насчет:

session.query(model.Entry).join((model.Blog, model.Entry.blogid==model.Blog.id)).filter(model.Blog.name=='Beatles Blog').all()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...