Найти - Пользователи
Полная версия: Django и Postgre
Начало » Django » Django и Postgre
1 2
Kamber
Уважаемое сообщество….

Вопрос новичка… возможно ли в джанге реализация следующих моментов
1. Запуск хранимой процедуры (функции) Postgre
2. Выполнение собственного SQL запроса и получение вразумительного ответа
3. Организация просмотра View базы Postgre

Заранее спасибо
tmt
Kamber
Уважаемое сообщество….

Вопрос новичка… возможно ли в джанге реализация следующих моментов
1. Запуск хранимой процедуры (функции) Postgre
2. Выполнение собственного SQL запроса и получение вразумительного ответа
3. Организация просмотра View базы Postgre

Заранее спасибо
1. Поскольку django ORM пытается “обезопасить” вас от работы с БД напрамую то “чистой” поддержки SP нет.
Но вы всегда можете использовать http://docs.djangoproject.com/en/dev/topics/db/sql/
или http://www.djangosnippets.org/snippets/118
2 и 3 - см п.1 По поводу “вразумительного ответа” смотрим “Mapping query fields to model fields” в том же линке.
tmt
Плюс, если поразмыслить, то сомневаюсь что полная поддержка SP на уровне ORM вообще нужна (или даже возможна).
Каждая БД использует собственный язык для написания сторед-процедур. А некоторые вообще их не имеют, тот же sqlite.
К тому же в том же Постгресе процедура может быть написана на том же питоне или перле. Плюс Оракл… и понеслась.
Нахождение правильного знаменателя превратится в поиск “сферического коня в вакууме”.
Надеюсь суть понятна.
Kamber
Не совсем…. есть работающая БД на PostgreSQL. В БД есть реализованные и работающие SP. И как их запускать???
Посмотрел в направлении http://docs.djangoproject.com/en/dev/topics/db/sql/ - все хорошо, только у меня Django 1.1. и raw не поддерживается…
Сделал выполнение произвольного SQL через курсор - возвращается набор строк.
Внимание вопрос:
Возможно ли полученный набор передать в Web - причем таким образом, чтобы на странице можно было указать конкретное поле из набора поля. Например {{raw.Поле1}}
tmt
Kamber
Не совсем…. есть работающая БД на PostgreSQL. В БД есть реализованные и работающие SP. И как их запускать???
Посмотрел в направлении http://docs.djangoproject.com/en/dev/topics/db/sql/ - все хорошо, только у меня Django 1.1. и raw не поддерживается…
Сделал выполнение произвольного SQL через курсор - возвращается набор строк.
Внимание вопрос:
Возможно ли полученный набор передать в Web - причем таким образом, чтобы на странице можно было указать конкретное поле из набора поля. Например {{raw.Поле1}}
Передать можно все что угодно, и любым образом. =) Но нужно самому заботиться о заполнении нужных в контексте переменных.

Исходя из документации:

Technically, when the template system encounters a dot, it tries the following lookups, in this order:
* Dictionary lookup
* Attribute lookup
* Method call
* List-index lookup

То есть, если в темплейте нужно доступ через точку, ваше “Поле1” должно соответсвовать хотябы одному из вышеперечисленных условий.
А как вы его к етому приведете (автоматически, через мапер, руками или силой мысли =)) это зависит от вас.

П.С.
Не знаю вашей причины невозможности апгрейда на джангу 1.2 (тем более уже релиз).
Но может не стоит изобретать велосипед? В любом случає, удачи Вам.
Kamber
Переход на 1.2 состоялся - проблема осталась.
Может кто-нибудь на пальцах объяснить - как из полученной строки получить значения полей.
views.py
         row = DB.objects.raw('SELECT * FROM db_DB')
return render_to_response('test.html', {'items': row})
В шаблоне
{% for item in items %}
<li>{{item}}</li>
{% endfor %}
Выдается список
DB object
DB object
DB object
А мне нужно получить значения полей, входящих в данный объект, типа
Поле1 Поле2 Поле3 и т.д.
Поле1 Поле2 Поле3
Поле1 Поле2 Поле3
Как быть
tmt
А так “Поле1” или любое другое выводит? ;)

{% for item in items %}
<li>{{item.Поле1}}</li>
{% endfor %}
Или в модель DB вставте код:
    def __unicode__(self):
return u'%s %s' % (self.Поле1, self.Поле2)
И посмотрите результат:
{% for item in items %}
<li>{{item}}</li>
{% endfor %}
Kamber
{% for item in items %}
<li>{{item.Поле1}}</li>
{% endfor %}
Как раз вот так оно и не выводит… именно к этому я и стремлюсь

Добавить код в модель можно - работает.. однако мне необходимо делать разные выборки из БД
т.е.
Поле1 Поле2
А на другом экране
Поле 1 Поле4 Поле5
Если нет возможности менять выборку полей - то это не устраивает
tmt
Если не выводит, значит не совпадают названия полей в модели и в выборке.
Добавте в выборке алиасы для полей через “as” чтоб названия совпадали или через аргумент “translations” в raw() и будет вам счастье.


Matching is done by name. This means that you can use SQL's AS clauses to map fields in the query to model fields. So if you had some other table that had Person data in it, you could easily map it into Person instances:
>>> Person.objects.raw('''SELECT first AS first_name,
... last AS last_name,
... bd AS birth_date,
... pk as id,
... FROM some_other_table)
As long as the names match, the model instances will be created correctly.
Alternatively, you can map fields in the query to model fields using the translations argument to raw(). This is a dictionary mapping names of fields in the query to names of fields on the model.

Прочитайте внимательно http://docs.djangoproject.com/en/dev/topics/db/sql/#mapping-query-fields-to-model-fields еще раз.
tmt
Kamber
{% for item in items %}
<li>{{item.Поле1}}</li>
{% endfor %}
Как раз вот так оно и не выводит… именно к этому я и стремлюсь

Добавить код в модель можно - работает.. однако мне необходимо делать разные выборки из БД
т.е.
Поле1 Поле2
А на другом экране
Поле 1 Поле4 Поле5
Если нет возможности менять выборку полей - то это не устраивает
Плюс не совсем понял…
{% for item in items %}
<li>{{item.Поле1}}</li>
{% endfor %}
не работает, а через
    def __unicode__(self):
return u'%s' % (self.Поле1)
работает?

Можете привести исходный код модели “DB” и структуру таблицы или вьюшки “db_DB” из которой идет выборка?
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB