SQL Server - ВЫБИРАЕТ ИЗ хранимой процедуры

Короткий ответ: нет, Вы не можете использовать Django ORM отдельно от Django.

длинный ответ: да, Вы можете, если Вы готовы загрузить значительные части Django наряду с ним. Например, соединение с базой данных, которое используется Django, открыто, когда запрос Django происходит. Это происходит, когда сигнал отправляется так, Вы могли якобы отправить этот сигнал открыть соединение, не используя определенный механизм запроса. Кроме того, необходимо было бы установить различные приложения и настройки для проекта Django.

В конечном счете, это, вероятно, не стоит Вашего времени. Алхимией SQL является относительно известный Python ORM, который на самом деле более мощен, чем Django так или иначе, так как это поддерживает несколько соединений с базой данных и организации пула подключений и другой хороший материал.

Редактирование: в ответ на критику James в другом месте, я разъясню то, что я описал в своем исходном сообщении. В то время как приятно, что участник майора Django вызвал меня, я все еще думаю, что я прав :)

Прежде всего, рассматриваю, какие потребности быть сделанным для использования ORM Django разделяют от любой другой части. Вы используете один из эти методы описанный James для того, чтобы сделать основную установку Django. Но много этих методов не допускают использование эти syncdb команда, которая требуется, чтобы составлять таблицы для Ваших моделей. settings.py файл необходим для этого с переменными не только для DATABASE_*, но также и INSTALLED_APPLICATIONS с корректными путями ко всем models.py файлам.

Это возможно к решению для самокрутки использовать syncdb без settings.py, но требуется некоторое усовершенствованное знание Django. Конечно, Вы не должны использовать syncdb; таблицы могут быть составлены независимо от моделей. Но это - аспект ORM, который не доступен, если Вы не прикладываете некоторые усилия к установке.

, Во-вторых, рассмотрите, как Вы создали бы свои запросы к DB со стандартом Model.objects.filter() вызов. Если это сделано как часть представления, это очень просто: создайте QuerySet и просмотрите экземпляры. Например:

tag_query = Tag.objects.filter( name='stackoverflow' )
if( tag_query.count() > 0 ):
    tag = tag_query[0]
    tag.name = 'stackoverflowed'
    tag.save()

Хороший, простой и чистый. Теперь, без опоры системы объединения в цепочку запроса/ответа Django, необходимо инициализировать соединение с базой данных, сделать запрос, затем закрыть соединение. Таким образом, вышеупомянутый пример становится:

from django.db import reset_queries, close_connection, _rollback_on_exception
reset_queries()
try:
    tag_query = Tag.objects.filter( name='stackoverflow' )
    if( tag_query.count() > 0 ):
        tag = tag_query[0]
        tag.name = 'stackoverflowed'
        tag.save()
except:
    _rollback_on_exception()
finally:
    close_connection()

управление соединением с базой данных может также быть сделано через сигналы Django. Все вышеупомянутое определяется в [1 111] django/db / init.py. Другие ORMs также имеют этот вид управления соединениями, но Вы не должны рыть в их источник, чтобы узнать, как сделать это. Система управления соединениями Алхимии SQL документируется в эти учебные руководства и в другом месте.

Наконец, необходимо иметь в виду, что объект соединения с базой данных локален для текущего потока в любом случае, который может или не может ограничить Вас в зависимости от Ваших требований. Если Ваше приложение не является не сохраняющим состояние, как Django, но персистентным, можно поразить проблемы поточной обработки.

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

не думают, что все вышеупомянутые шоу, мне не нравятся Django и все, которое это - работы, мне действительно нравится Django много! Но я реалистичен относительно того, что это - возможности, и быть библиотекой ORM не один из них.

P.S. Несколько поддержка соединения с базой данных работавшие на. Но это не там теперь.

312
задан the Tin Man 19 September 2012 в 07:31
поделиться

7 ответов

Вместо процедуры можно использовать Пользовательскую функцию или представление .

Процедура может возвращать несколько наборов результатов, каждый с собственной схемой. Он не подходит для использования в операторе SELECT .

144
ответ дан 23 November 2019 в 01:10
поделиться

Вы можете немного схитрить с OPENROWSET:

SELECT ...fieldlist...
FROM OPENROWSET('SQLNCLI', 'connection string', 'name of sp')
WHERE ...

Это, конечно, все равно будет запускать весь SP каждый раз.

5
ответ дан 23 November 2019 в 01:10
поделиться

Вам либо нужна функция с табличным значением , либо вставьте EXEC во временную таблицу:

INSERT INTO #tab EXEC MyProc
73
ответ дан 23 November 2019 в 01:10
поделиться

Похоже, вам просто нужно использовать представление . Представление позволяет представить запрос в виде таблицы, чтобы можно было запрашивать его, представление.

2
ответ дан 23 November 2019 в 01:10
поделиться

Вам следует взглянуть на эту отличную статью Эрланда Соммарскога:

В ней перечислены все доступные варианты для вашего сценария.

156
ответ дан 23 November 2019 в 01:10
поделиться

Вы можете

  1. создать табличную переменную для хранения набор результатов из сохраненной процедуры и затем
  2. вставьте вывод сохраненная процедура в переменной таблицы, а затем
  3. используйте табличную переменную точно так же, как и любой другой table ...

... sql ....

Declare @T Table ([column definitions here])
Insert @T Exec storedProcname params 
Select * from @T Where ...
179
ответ дан 23 November 2019 в 01:10
поделиться

Вы можете скопировать вывод из sp в временную таблицу.

CREATE TABLE #GetVersionValues
(
    [Index] int,
    [Name]  sysname,
    Internal_value  int,
    Character_Value sysname
)
INSERT #GetVersionValues EXEC master.dbo.xp_msver 'WindowsVersion'
SELECT * FROM #GetVersionValues
drop TABLE #GetVersionValues
23
ответ дан 23 November 2019 в 01:10
поделиться
Другие вопросы по тегам:

Похожие вопросы: