LINUX.ORG.RU

Пыхотред

 


4

7

А чего это у нас, в нашем загончике, нет закрепленного пыхотреда?

Вот теперь есть(надеюсь, его закрепят).

Практически каждый программист, хотя бы раз в жизни, что-то да писал на пыхе. На пыхе работает 40% всего веба, если не больше. Пых велик, могуч, ужасен, но также добр и заботлив.

В тред приглашаются все пыхобоги, пыходемоны, пыхофрилансеры, простые пыхари, и даже пыхоненавистники.

Обсудить есть много чего, начиная с различий версий, особенностей языка, CMS-ок, фреймворков, и заканчивая говнокодом.

<?php

★★★
Ответ на: комментарий от cab

Мне удобней писать на языке, на котором я пишу, чем SQL. Например у меня manytomany связь entity - user, вместо

SELECT * FROM "auth_user" INNER JOIN "business_entity_users" ON ("auth_user"."id" = "business_entity_users"."user_id") WHERE ("business_entity_users"."entity_id" = (SELECT id from "entity" WHERE name="ЯНДЕКС") AND "auth_user"."username" = ph)

Я пишу

Entity.objects.get(name='ЯНДЕКС').users.filter(username='ph')

Получаю объект User, в котором я могу что-то изменить и сделать .save() вместо того чтобы ручками писать update.

pawnhearts ★★★★★
()
Ответ на: комментарий от pawnhearts

SQL, конечно, далеко не эталон читабельности и лаконичности, но такой вариант несколько лучше:

SELECT * FROM auth_user u
JOIN business_entity_users b ON u.id = b.user_id
JOIN entity e ON b.entity_id = e.id
WHERE e.name='ЯНДЕКС' AND u.username = 'ph'

1) Однако, из ORM-кода не поймешь, что, собственно, задействовано выборке. Надо лезть в потроха объектов, чтобы понять, как там связаны 3 таблицы. Без SQL я бы считал, что таблиц там 2. Т.е. налицо усложнение поддержки
2) Сгенерированный SQL потенцально (а на некоторых СУБД - реально) менее производительный из-за встроеного запроса.

cab ★★★★
()
Последнее исправление: cab (всего исправлений: 1)
Ответ на: комментарий от pawnhearts

вместо ... Я пишу

Т.е. ты всегда отслеживаешь во что именно оттранслируется цепочка методов? Или тебе пофиг, пусть что хочет делает? А он такой вместо джойнов тебе выгребет n+1 запросов. Или наоборот, там где лучше бы джойнов избежать, соединит 10 таблиц.

anonymous
()
Ответ на: комментарий от anonymous

Ну, в джанге можно нажать кнопочку и оно тебе покажет какие запросы выполнились на странице и сколько времени они занимали. https://raw.github.com/jazzband/django-debug-toolbar/master/example/django-de...

Поведние будут ли джоины или много запросов определяется наличием всяких select_related / prefetch_related.

В алхимии можно вообще можно явно это всё указывать.

pawnhearts ★★★★★
()
Ответ на: комментарий от pawnhearts

Получаю объект User, в котором я могу что-то изменить и сделать .save()

Проблема многих ORM в том, что они реализуют только вещи, которые общие для разных баз. И поэтому невозможно выполнить SELECT ... FOR UPDATE на MySQL базе, например.

aiive
()
Ответ на: комментарий от aiive

В алхимии это есть.

реализуют только вещи, которые общие для разных баз

Я выше кидал пример для оракла, аналогичные штуки для других баз.

Даже в django orm есть вещи типа https://docs.djangoproject.com/en/2.0/ref/contrib/postgres/

pawnhearts ★★★★★
()