LINUX.ORG.RU
ФорумTalks

новый постгрес внушает


0

1

Попробовал новый постгрес, внушает

select
    xmlroot(
        xmlelement(name requests,
            xmlagg(
                xmlelement(name item,
                    xmlforest(cr.id,cr.user_id,u.name as user_name,f.name as firm_name),
                    (
                        select
                            xmlelement(name orders,
                                xmlagg(
                                    xmlelement(name item,
                                        xmlforest(cro.id,cro.item_name,cro.quantity,cro.lead_id,l.name as lead_name)
                                    )
                                order by cro.id)
                            ) as orders
                        from
                            Tcustomer_request_orders cro,
                            Tleads l
                        where
                            cro.request_id=cr.id and
                            cro.lead_id=l.id
                    )
                )
            order by cr.id desc)
        ),
        version '1.0',
        standalone yes
    ) as ret
from
    Tcustomer_requests cr,
    Tusers u,
    Tfirms f
where
    cr.user_id=u.id and
    u.firm_id=f.id

Результат:

<?xml version="1.0" standalone="yes"?>
<requests>
 <item>
  <id>8</id><user_id>5</user_id><user_name>Маша</user_name><firm_name>Ромашка</firm_name>
  <orders>
   <item>
    <id>13</id><item_name>MAX328</item_name><quantity>10</quantity><lead_id>2</lead_id><lead_name>lead</lead_name>
   </item>
   <item>
    <id>14</id><item_name>MAX329</item_name><quantity>20</quantity><lead_id>2</lead_id><lead_name>lead</lead_name>
   </item>
   <item>
    <id>15</id><item_name>MAX320</item_name><quantity>30</quantity><lead_id>1</lead_id><lead_name>?</lead_name>
   </item>
  </orders>
 </item>
 <item>
  <id>7</id><user_id>5</user_id><user_name>Маша</user_name><firm_name>Ромашка</firm_name>
  <orders>
   <item>
    <id>10</id><item_name>MAX324</item_name><quantity>60</quantity><lead_id>2</lead_id><lead_name>lead</lead_name>
   </item>
   <item>
    <id>11</id><item_name>MAX323</item_name><quantity>70</quantity><lead_id>1</lead_id><lead_name>?</lead_name>
   </item>
   <item>
    <id>12</id><item_name>MAX321</item_name><quantity>80</quantity><lead_id>2</lead_id><lead_name>lead</lead_name>
   </item>
  </orders>
 </item>
 <item>
  <id>6</id><user_id>5</user_id><user_name>Маша</user_name><firm_name>Ромашка</firm_name>
  <orders>
   <item>
    <id>9</id><item_name>MAX325</item_name><quantity>50</quantity><lead_id>2</lead_id><lead_name>lead</lead_name>
   </item>
  </orders>
 </item>
 <item>
  <id>5</id><user_id>5</user_id><user_name>Маша</user_name><firm_name>Ромашка</firm_name>
  <orders>
   <item>
    <id>8</id><item_name>MAX325</item_name><quantity>40</quantity><lead_id>2</lead_id><lead_name>lead</lead_name>
   </item>
  </orders>
 </item>
 <item>
  <id>4</id><user_id>7</user_id><user_name>Вася</user_name><firm_name>ВП Система</firm_name>
  <orders>
   <item>
    <id>7</id><item_name>MAX324</item_name><quantity>30</quantity><lead_id>2</lead_id><lead_name>lead</lead_name>
   </item>
  </orders>
 </item>
 <item>
  <id>3</id><user_id>7</user_id><user_name>Вася</user_name><firm_name>ВП Система</firm_name>
  <orders>
   <item>
    <id>6</id><item_name>MAX323</item_name><quantity>20</quantity><lead_id>3</lead_id><lead_name>lead-free</lead_name>
   </item>
  </orders>
 </item>
 <item>
  <id>2</id><user_id>6</user_id><user_name>Петя</user_name><firm_name>Лютик</firm_name>
  <orders>
   <item>
    <id>3</id><item_name>MAX325</item_name><quantity>90</quantity><lead_id>2</lead_id><lead_name>lead</lead_name>
   </item>
   <item>
    <id>4</id><item_name>MAX326</item_name><quantity>90</quantity><lead_id>3</lead_id><lead_name>lead-free</lead_name>
   </item>
   <item>
    <id>5</id><item_name>MAX328</item_name><quantity>10</quantity><lead_id>3</lead_id><lead_name>lead-free</lead_name>
   </item>
  </orders>
 </item>
 <item>
  <id>1</id><user_id>5</user_id><user_name>Маша</user_name><firm_name>Ромашка</firm_name>
  <orders>
   <item>
    <id>1</id><item_name>MAX323</item_name><quantity>50</quantity><lead_id>1</lead_id><lead_name>?</lead_name>
   </item>
   <item>
    <id>2</id><item_name>MAX324</item_name><quantity>70</quantity><lead_id>2</lead_id><lead_name>lead</lead_name>
   </item>
  </orders>
 </item>
</requests>

★★★

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

Для всех кому интересно: http://www.postgresql.org/docs/9.0/static/release-9-0

Лично я нашел для себя LDAP-авторизацию из коробки, что не может не радовать :) А также мелкие вкусняшки для перла.

Круто! Сенкс за новость :)

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

да она ещё 4 года назад у меня свершилась. на oracle 9.

vahvarh ★★★
() автор топика

Только атрибуты на русском не работают :(

select xmlroot(xmlelement(name requests, xmlattributes('русс' as кий), 'ё'), version '1.0', standalone yes);
                                             xmlroot                                             
-------------------------------------------------------------------------------------------------
 <?xml version="1.0" standalone="yes"?><requests кий="&#x440;&#x443;&#x441;&#x441;">ё</requests>

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

>LDAP-авторизацию

аутентификацию или авторизацию? В официальном changelog'е я про авторизацию ни слова не нашел.

leave ★★★★★
()

А у тебя нет желания на LOR Wiki написать какие-нибудь вкусные tips'n'tricks, которые только теперь стали доступными?

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

> мечта о сайте целиком на SQL

Теперь я понимаю, что сайты на XSLT пишут не оттого, что это удобно или полезно для ваших волос... Просто люди настолько привыкли пользоваться микроскопом, что даже гвозди ими забивают.

queen3 ★★★★★
()

По-прежнему на создание одной страницы делаешь по две тысячи запросов?

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

>аутентификацию или авторизацию?

Наверное последнее (могу ошибаться), т.к:

Allow LDAP (Lightweight Directory Access Protocol) authentication to operate in «search/bind» mode (Robert Fleming, Magnus Hagander)

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

вы так говорите, как будто это что-то плохое )))
1. куда-то всё равно нужно выбирать данные для того чтобы отдать в шаблонизатор - почему бы этому не быть xml-деревом?
2. чем xslt хуже любого другого шаблонизатора?

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

> подозреваю, проблема в невыставленном encoding=«utf8», но как его выставить - пока не нашёл.

угу, postgres не делает xmlTextWriterStartDocument(writer, NULL, «UTF-8», NULL), непонятно почему libxml2 считающий по умолчанию что текст в UTF8 вдруг этот же самый текст корёжит в значениях атрибута.

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

1. xml - сразу нет. Например, дотнетовский сериализатор в xml выдаёт объём данных в 10-20! раз больше, чем в виде protobuf. В основном потому же, почему и xml - куча излишних тэгов, нэймспейсы, пустый массивы обозначаются как <array />, а не как 0 байт, и т.п. Плюс, потеря информации о типе, время обработки всего этого чуда, и т.п.

2. Хуже соотношением код_шаблона/код_страницы - 3:1 вместо 1:3 - это в случае, когда надо сгенерировать не сильно xml-подобную модель, а на страничках такое встречается. Я через XSLT как-то генерировал исходники C++/C#, вот это реально ужас на крыльях ночи.

Да одного взгляда на
<id>9</id><item_name>MAX325</item_name><quantity>50</quantity><lead_id>2</lead_id><lead_name>lead</lead_name>
достаточно, чтобы содрогнуться.

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

Ты кое-что забываешь, говоря про сериализацию в xml - а что, тебе кто-то предлагает ею заниматься? пока xml хранится в памяти в виде древовидной структуры, он ничем не хуже любого другого формата. а xslt (надеюсь) в postgres встроенный. так что не будет занимания памяти а также потерь на сборку в строку-разборку.

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

Т.е. SQL (или там XSLT) будет выполняться целиком на базе, и отдавать она будет уже готовую страничку с HTML (или там json)? Если нет - то мои претензии остаются в силе. Если да - то даже затрудняюсь придумать все ограничения (типа доступа к переменным сервера и прочая) что тебе придётся заодно запихнуть в базу. Да и будет ли это уже база, а не веб-сервер? Назад от n-tier в прошлое?

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

тут вопрос в том что ты понимаешь в «n-tier». Если вспоминать про варианты когда есть resin(web)+orion(j2ee)+oracle и они таскают данные друг у друга через 3 машины то мне кажется это гораздо более худшим решением.

опять же, зачем делать работу с базой и логику на разных языках?

vahvarh ★★★
() автор топика
Ответ на: комментарий от vahvarh
DataBean bean = ...
JAXBContext context = JAXBContext.newInstance(DataBean.class);
Marshaller marshaller = context.createMarshaller();
marshaller.marshal(bean, writer);

где writer - куда писать, собственно.

Для тех,кто привяжется к трем строчкам, вот одна:

JAXBContext.newInstance(DataBean.class).createMarshaller().marshal(bean, writer);

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

а где сами запросы? обрати внимание, кстати, что в каждой строчке из Tcustomer_requests cr содержится [0..n] строчек из Tcustomer_request_orders cro where cro.request_id=cr.id

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

я имел в виду только сериализацию результатов запроса в xml

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

хм, вижу, еще с выборкой внутри xml. И возможностью не просто сериализации, а обработки и изменения представления и аггрегации. Да, согласен, это действительно много.
Но я все таки предпочел бы результат запроса как таблицу, нежели xml. Это проще.

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

Web по любому будет - web server нужен. Если ты не встраиваешь его в DB, то обламываешься, т.к. язык генерации страничек (SQL/XSLT) должен иметь доступ к возможностям сервера - переменным, чтению файлов, и т.п. Если тебе нужен веб сервер в базе - ну, добавь фичреквест в постгрес, вдруг сделают?

А пока что всё, что ты можешь сделать - это убрать middle, запихнув бизнес логику (а не генерацию веб страничек) в базу. Хорошо это или плохо - я спорить не буду, ибо по тебе видно, что не переубедишь ;-) Речь о другом - что генерацию страничек в базу не запихнёшь, и XML/XSLT придётся всё-таки гонять между web и db, а оно для этого не очень.

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

тут вопрос в том, «хочешь ли ты обрабатывать этот результат запроса или нет». Его можно просто навернуть ещё слегка и тогда уже его обрабатывать не понадобится. То есть 100% работы будет сделано постгресом. Либо в xslt отдать либо просто отослать в какой-нибудь ajax-модуль на клиенте.

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

ну опять же, я не совсем понимаю фразу «переменные сервера и файлы». Статику можно отдавать другим веб-сервером, сидящим на http://pic.имя-сайта, а если ты про query_string и тд - то таки да, нужно допиливать постгрес или сделать программку в 50 строк на перле.

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

Ты, по-моему, заработался в своей узкой области сортировки и фильтрации сложных ERP данных прямиком в базе. Помимо query_string, у сервера есть ещё дофига возможностей, которые странички используют - HTTP хидеры, чтение файлов, выполнение скриптов и файлов (а также богомерзких activex), генерация PDF и картинок, контакт с 3rd-party серверами (over 9000), и прочая.

Да в конце концов, возможность напрямую писать в response stream для скорости.

В твоём частном случае, SQL для базы может сработать. Но я говорил о том, что «мечта о сайте целиком на SQL» исходит из привычек и предпочтений конкретных людей, а не из реалий - в реальности такая мечта подойдёт для 1% проектов, даже меньше. Поэтому мечта эта реальностью быть не может, ибо решает мизерное количество задач.

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

совпадение в том что мне платят за этот 1%.

опять же, например для интернет магазина, нафиг нужны активx?

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

ну и если уж из области извращений, то и оракл и постгрес могут слать почту и читать imap, отправлять запросы по http и даже работать с сокетами.

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

Например, генерировать XLS с ценами. Или Word файл с чеком. Или вызывать 3rd-party сервис для генерации лицензий (не все интернет магазины просты как амёба). Да мало ли. И помимо activex, я перечислил ещё много других фич, кстати, а его вообще взял в скобки как второстепенный.

В общем, SQL/XSLT для генерации страничек прямиком из базы имеет столько ограничений, что мечтой оно может стать только в крайне ограниченном кругу, что нивелирует применимость слова «мечта» в этом случае. Ну не вяжутся у меня понятия «мечта» и «шаг влево, шаг вправо - стена».

queen3 ★★★★★
()

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

ЗЫ Да, я терпеть не могу stored procs

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

Я пробовал, юзаю Убунту. Мне доки не нравятся, и вообще.

queen3 ★★★★★
()

Судя по первому скрипту это XQuery?

Karapuz ★★★★★
()

>внушает

Кофе он ещё не варит? А хотя бы 3D-рендеринг умеет делать?

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

Но я все таки предпочел бы результат запроса как таблицу, нежели xml. Это проще


Так xml отдается чужому сайту в ответ на запрос, Machine2Machine services

И никого не парит, как потом клиент собирается этот xml обрабатывать, зато не надо отдавать 5 разных форматов и писать для этого 5 разных программ

Удобно же и дешево

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

скажем так, я считаю, что xml - это view, для использования в качестве model он, мне кажется, не очень хорошо подходит. Т.е. должна быть моделька в виде набора записей, которую ты сможешь отдавать в любом виде - будь то json, xml или еще что-либо.

JFreeM ★★★☆
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.