Intereting Posts
SQL: выберите динамическое число строк в виде столбцов Читатель не читает данные C # Создать запрос для сравнения DateTime с SQL Nvarchar date Column Динамический параметризованный запрос с похожим Как получить самые близкие даты в Oracle sql Оператор не существует: json = json Есть ли запрос Oracle SQL, который объединяет несколько строк в одну строку? SQL: Обновить таблицу с изображением из папки, по id # Я написал SQL-запрос, но не выполнил, ПОЧЕМУ? Ошибка при обновлении сетевых интерфейсов DB: SQL, ошибка: 26 – Ошибка определения местоположения сервера / экземпляра Дамп Postgresql создает последовательности, которые начинаются с – или после – последнего ключа? хранить изображение в базе данных или в системном файле? Как выбрать записи с максимальными значениями в двух столбцах? Кристаллические отчеты должны группироваться по производным датам Как конвертировать запрос SQL Query to Rails Active Record?

порядок столбцов в инструкции SELECT * – гарантируется?

Я использую ORM (sqlalchemy) для извлечения данных из базы данных PG. Я хочу, чтобы не указывать все имена столбцов таблицы в моих обработанных вручную операциях SQL *.

До сих пор мое предположение заключается в том, что возвращаемые столбцы находятся в порядке операторов DDL, используемых для создания таблиц db. Пока это работает, но я хочу знать, является ли это просто удачей или если оно специально адресовано в спецификации SQL (ANSI).

т.е. ANSI SQL (и, следовательно, предположительно, база данных) гарантирует порядок столбцов, возвращаемых в SELECT * ?

Я использую PostgreSQL 8.4, так как мой бэкэнд db

  • да, я знаю, что использование ручных SQL-заявлений с ORM поражает цель ORM, но потребности должны …

Рассмотрим стандарт SQL, раздел 7.9 <query specification> как указано здесь:

http://www.contrib.andrew.cmu.edu/~shadow/sql/sql1992.txt

 <query specification> ::= SELECT [ <set quantifier> ] <select list> <table expression> [...] <select list> ::= <asterisk> | <select sublist> [ { <comma> <select sublist> }... ] [...] Syntax Rules 1) Let T be the result of the <table expression>. 3) Case: a) [...] b) Otherwise, the <select list> "*" is equivalent to a <value expression> sequence in which each <value expression> is a <column reference> that references a column of T and each column of T is referenced exactly once. The columns are ref- erenced in the ascending sequence of their ordinal position within T. 

Итак, другими словами, да, стандарт SQL указывает, что столбцы должны проецироваться в соответствии с их порядковым положением в пределах T Обратите внимание, что все становится немного сложнее, когда ваше <table expression> состоит из нескольких таблиц с участием JOIN .. USING или NATURAL JOIN . Однако при выборе из простой таблицы вы, вероятно, прекрасно предполагаете, что порядок соответствует ожиданиям.

Для полноты значение ordinal position within T для таблиц объясняется далее в 11.4 <column definition> :

 General Rules 5) [...] The ordinal position included in the column descriptor is equal to the degree of T. [...] 

А затем в 11.11 <add column definition> (для операторов ALTER TABLE )

 General Rules 4) [...] In particular, the degree of T is increased by 1 and the ordinal position of that column is equal to the new degree of T as specified in the General Rules of Subclause 11.4, "<column definition>". 

Существует немало других предложений и предложений SQL, которые зависят от формальной спецификации ordinal positions в <table expressions> . Некоторые примеры:

 13.8 <insert statement> (when omitting the `<insert column list>`) 20.2 <direct select statement: multiple rows> (when `<sort specification>` contains an `<unsigned integer>`) 

Postgres, в частности, вполне совместим со стандартами, поэтому, если вы действительно хотите SELECT * , продолжайте!