powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Как узнать: номер, имя и тип поля?
24 сообщений из 24, страница 1 из 1
Как узнать: номер, имя и тип поля?
    #33523791
savrock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть таблица, и нужно получить информациию о её полях одним запросом...

1 - номер,
2 - имя,
3 - тип_данных.

Проблема с запросом к системным таблицам Postgre...
(вместо 41587 впишите номер любой вашей таблицы)

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
-- Выбрать: Номер, Имя, Тип
SELECT a.attnum, a.attname, t.typname
FROM pg_attribute a
LEFT JOIN pg_type t ON a.atttypid=t.typelem
-- Таблица OID: 41587 и Не покзывать системные поля
WHERE a.attrelid= 41587  AND a.attnum >  0 
-- Сортировка по номеру поля
ORDER BY a.attnum

Запрос работает, НО!

Если встречается поле у которого тип int2,
то запрос возвращает не одну, а две! строки с для этого поля с одинаковым номером, в одной указан тип _int2 , а в другой int2vector .

Так как узнать правильный тип, тот что был указан при создании поля ???

Help!!!
...
Рейтинг: 0 / 0
Как узнать: номер, имя и тип поля?
    #33523920
Фотография barry
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
savrock...
Если встречается поле у которого тип int2,
то запрос возвращает не одну, а две! строки с для этого поля с одинаковым номером, в одной указан тип _int2 , а в другой int2vector .

Так как узнать правильный тип, тот что был указан при создании поля ???

Help!!!
Наверное у одной из них attisdropped = True :-)
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
  Q.SQL.Add('select a.attname AS column_name, a.atttypid, a.atttypmod,');
  Q.SQL.Add('pg_catalog.format_type(a.atttypid, null) as data_type,');
  Q.SQL.Add('information_schema._pg_char_max_length(a.atttypid, a.atttypmod) as char_length,');
  Q.SQL.Add('information_schema._pg_numeric_precision(a.atttypid, a.atttypmod) as prec,');
  Q.SQL.Add('information_schema._pg_numeric_scale(a.atttypid, a.atttypmod) as scale,');
  Q.SQL.Add('ad.adsrc, a.attnotnull as is_notnull, d.description');
  Q.SQL.Add('from pg_attribute a');
  Q.SQL.Add('join pg_type t on t.oid = a.atttypid');
  Q.SQL.Add('left join pg_attrdef ad on ad.adrelid = a.attrelid and ad.adnum = a.attnum');
  Q.SQL.Add('left join pg_description d on d.objoid = a.attrelid and d.objsubid = a.attnum');
  Q.SQL.Add('                              and d.classoid = '+IntToStr(PGClassOID));
  Q.SQL.Add('where a.attrelid = '+IntToStr(OID)+' and a.attnum >= 1');
  Q.SQL.Add('and not a.attisdropped');
  Q.SQL.Add('order by a.attnum');
...
Рейтинг: 0 / 0
Как узнать: номер, имя и тип поля?
    #33524016
savrock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
barry
Наверное у одной из них attisdropped = True :-)

attisdropped оказались все False... но на будущее я добавил и это условие, спасибо!

Мегапомогла эта строчка из твоего примера!
barry
Код: plaintext
Q.SQL.Add('join pg_type t on t.oid = a.atttypid');

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

Правильный запрос теперь работает нормально!
Код: plaintext
1.
2.
3.
4.
SELECT a.attnum, a.attname, t.typname
FROM pg_attribute a
LEFT JOIN pg_type t ON t.oid = a.atttypid
WHERE a.attrelid= 41587  AND a.attnum >  0  AND NOT a.attisdropped
ORDER BY a.attnum

Спасибо за помощь!
...
Рейтинг: 0 / 0
Как узнать: номер, имя и тип поля?
    #33524701
фффф
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Лучше пользоваться information_schema. Системные таблицы меняются от версии к версии, а information_schema входит в стандарт SQL. Либо использовать функции получения метаданных, которые предоставляет драйвер (ODBC/JDBC/DBI). Если конечно не требуются специфичные для PostgreSQL метаданные.
Код: plaintext
1.
2.
3.
4.
SELECT ordinal_position, column_name, data_type
FROM information_schema.columns
WHERE table_name='table1'
ORDER BY  1 ;
...
Рейтинг: 0 / 0
Как узнать: номер, имя и тип поля?
    #33526286
Фотография barry
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
> Лучше пользоваться information_schema. Системные таблицы меняются от версии к версии, а information_schema входит в стандарт SQL. Либо использовать функции получения метаданных, которые предоставляет драйвер (ODBC/JDBC/DBI). Если конечно не требуются специфичные для PostgreSQL метаданные.
> SELECT ordinal_position, column_name, data_type
> FROM information_schema.columns
> WHERE table_name='table1'
> ORDER BY 1;

В общем случае - да. Я собственно с этого и начинал, и даже information_schema есть не только в PostgreSQL. Но... все information_shema страдают тем, что это как правило view. А колонки как правило получают по отдельной таблице. И далее при выборке как правило мы получаем чтение всей записей из information_schema и потом фильтровку по таблице, а не оптимальное чтение по ключам, т.е. приличные тормоза. Запрос на системных таблицах отрабатывает намного быстрее, особенно это заметно когда нам надо извлечь информацию по всем таблицам (поля по каждой отдельно), например при извлечении метаданных.
Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
Как узнать: номер, имя и тип поля?
    #33527093
savrock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
На самом деле медленные VIEW-ы для моей задачи не проблема.
Просто я сейчас разрабатываю структуру новой базы и не нашел ни одной программы для визуализации моих таблиц и отношений внешних ключей в таблицах. А-ля MS Access "схема данных".

Быстренько/страшненько написал на Си себе такую программку (скриншот я прилагаю).
А недавно скачал примеры баз данных http://pgfoundry.org/projects/dbsamples , открыл и увидел глюки с полями в своей проге, некоторые поля (int2, int8) повторялись аж по 3 раза :) Это была та самая ошибка в запросе к системным таблицам.

Вот тот страшненький запрос...
Код: plaintext
1.
2.
3.
4.
5.
6.
SELECT a.attnum, a.attname, t.typname, i.indisprimary, f.confrelid, f.confkey[ 1 ]
FROM pg_attribute a
LEFT JOIN pg_type t ON t.oid = a.atttypid
LEFT JOIN pg_index i ON a.attrelid=i.indrelid AND a.attnum=i.indkey[ 0 ]
LEFT JOIN pg_constraint f ON a.attrelid=f.conrelid AND f.contype='f' AND a.attnum=f.conkey[ 1 ]
WHERE a.attrelid =  41388  AND a.attnum >  0  AND NOT a.attisdropped
ORDER BY a.attnum

Ну, а на будущее, если конечно до этого руки дойдут, надо будет переделать под выборку из information_schema.
...
Рейтинг: 0 / 0
Как узнать: номер, имя и тип поля?
    #33528109
Funny_Falcon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Извини за наглость :-) А опенсоурснить програмку не желаешь?
Проектик маленький на PgFoundry? Люди спасибо скажут ;-)
Без наездов, просто пожелание. У меня, например, силенок не хватить "набросать" такую програмку "быстренько/...".
...
Рейтинг: 0 / 0
Как узнать: номер, имя и тип поля?
    #33529485
savrock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Funny_FalconИзвини за наглость :-) А опенсоурснить програмку не желаешь?
Проектик маленький на PgFoundry? Люди спасибо скажут ;-)
Без наездов, просто пожелание. У меня, например, силенок не хватить "набросать" такую програмку "быстренько/...".
Мне совершенно, не жалко отдать ее людям :)

Но , я не программист (не считаю себя таковым), и программы пишу исключительно для себя, быстро и "страшно" некрасиво, c поддавками и ограничениями. Конкретно под текущую свою задачу. И мне стыдно демонстрировать "исходник-лажу" :(

Могу отдать бинарник, как он есть, 19Кб в архиве.
Если кому такое "чудо" надо, завтра выложу, да кстати, на этом форуме можно такое выкладывать?

А если будет время, надо будет переписать код, привести его в порядок и тогда можно и на PgFoundry проектик сделать :)
...
Рейтинг: 0 / 0
Как узнать: номер, имя и тип поля?
    #33531710
savrock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вот та прога для визуализации таблиц и отношений внешних ключей.
При первом запуске создает ini файл, его нужен отредактировать.
Внести имя хоста, базы, пользователя, пароль и имя схемы.
После повторного запуска она покажет таблицы, их можно подвигать.

Кнопки:
F1 - Помощь.
F2 - Пишет картинку.
F5 - Рефрешит и перечитывает базу.


Для ее работы нужны все клиентские dll-ки postgres-а.
Никакой гарантии правильной работы и никакой поддержки.
Делалось как временный инструмент самому себе, так что если кто знает подобную "нормальную" программу сообщите мне, буду благодарен.
...
Рейтинг: 0 / 0
Как узнать: номер, имя и тип поля?
    #33533608
Funny_Falcon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
жаль, у меня не запустилось, винда ругнулась :-(
...
Рейтинг: 0 / 0
Как узнать: номер, имя и тип поля?
    #33533804
savrock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Funny_Falconжаль, у меня не запустилось, винда ругнулась :-(

А что за ошибка? Какой там текст ошибки?

При первом запуске обязательно появится ошибка!!!
Потому что нет файла конфигурации, он появится после первого запуска.

Код: plaintext
basesetings.ini
(ха, с оной буквой t :)

Его нужно изменить, в первой строке должны быть 5 слов:
имя_вашего_сервера
имя_базы
имя_пользователя
пароль
имя_схемы_данных

Вот например:
Код: plaintext
localhost base01 auser 1234 public
или
Код: plaintext
192.168.0.13 test phpuser qwerty public

Если в базе есть таблицы они появятся в окне.
...
Рейтинг: 0 / 0
Как узнать: номер, имя и тип поля?
    #33534072
Gold Fish
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У меня тоже ругается. типа приложение выполнило недопустимую операцию и будет закрыто.
...
Рейтинг: 0 / 0
Как узнать: номер, имя и тип поля?
    #33534335
Funny_Falcon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ага именно при втором запуске, а во время первого нормально создает файлик. Видимо еще какой dll не хватает. А еще, я сижу на RemoteDesctop - может поэтому?
...
Рейтинг: 0 / 0
Как узнать: номер, имя и тип поля?
    #33534610
savrock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Gold FishУ меня тоже ругается. типа приложение выполнило недопустимую операцию и будет закрыто.
Я пробовал ее на разных машинах, современных и древних и под разными версиями win, (XP, XP sp2, win98se) ошибок с "недопустимой операцией" не было ниразу, сервер был версии 8.1.0.

Правда есть несколько критичных ограничений, припоминаю:
1 - кол-во таблиц: <= 30
2 - кол-во полей в таблице: <= 50
3 - имена таблиц: без пробелов (хотя, только сохранение не будет работать)

Из-за 1 и 2 может возникнуть ошибка "приложение выполнило недопустимую операцию ...", т.к. там простые масивы.

Да, и на машине где не установлен Postgres (хотя бы клиентская часть), нужны будут следущие его dll-ки, но про них сообщит система:
Код: plaintext
1.
2.
3.
4.
5.
6.
libpq.dll
comerr32.dll
libeay32.dll
libintl-2.dll
libiconv-2.dll
krb5_32.dll
ssleay32.dll
...
Рейтинг: 0 / 0
Как узнать: номер, имя и тип поля?
    #33534834
Gold Fish
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тогда понятно! у меня 55 таблиц :-(
...
Рейтинг: 0 / 0
Как узнать: номер, имя и тип поля?
    #33535167
savrock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Gold FishТогда понятно! у меня 55 таблиц :-(

Ок, исправлю одну цифру, и тогда выложу новую мультитабличную версию :) на 100 таблиц.
...
Рейтинг: 0 / 0
Как узнать: номер, имя и тип поля?
    #33535357
Фотография barry
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
> Тогда понятно! у меня 55 таблиц :-(
>
>
> Ок, исправлю одну цифру, и тогда выложу новую мультитабличную версию :) на 100 таблиц.

Вот а началось массовое тестирование, то ли еще будет. :-)
Может их в TStringList лучше хранить? Или в динамическом массиве.
100 таблиц - это тоже детское количество, у меня их например за 300, правда это база не на Postgres, но думаю это не принципиально. В 1С - в районе 2 тыс. таблиц.
Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
Как узнать: номер, имя и тип поля?
    #33535522
savrock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
barry> Тогда понятно! у меня 55 таблиц :-(
>
> Ок, исправлю одну цифру, и тогда выложу новую мультитабличную версию :) на 100 таблиц.

Вот а началось массовое тестирование, то ли еще будет. :-)
Может их в TStringList лучше хранить? Или в динамическом массиве.
100 таблиц - это тоже детское количество, у меня их например за 300, правда это база не на Postgres, но думаю это не принципиально. В 1С - в районе 2 тыс. таблиц.
Posted via ActualForum NNTP Server 1.3
Вот версия на 350 таблиц.

Но я с трудом представляю как можно красиво расставить на моем "холсте" такое количество таблиц :)
Можно, если отношений/ограничений между ними будет мало, а иначе все почеркается связями.

Может при такой сложности надо переходить на ER-диаграммы (отношений сущьностей).

Вот программа:
...
Рейтинг: 0 / 0
Как узнать: номер, имя и тип поля?
    #33535625
Фотография barry
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
savrockВот версия на 350 таблиц.

Но я с трудом представляю как можно красиво расставить на моем "холсте" такое количество таблиц :)
Твой холст лет через 10 может вырасти до NxN метров, если ты об этом заблаговременно позаботишься. :-) Компьютерная индустрия шагала и шагает семимильными шагами.
По крайней мере, вывалиться по AV в ситуации которую ты четко знаешь и можешь предотвратить - ну это как минимум неспортивно. Ну вставь там if, скажи "Обрабатывается не более 100 таблиц" и нормально, спокойно вываливайся. AV - это самая хреновая вешь, про нее можно выдвигать сотни гипотез, собственно говоря с чего и началось юзанье твоей приблуды.
...
Рейтинг: 0 / 0
Как узнать: номер, имя и тип поля?
    #33536371
savrock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
barryТвой холст лет через 10 может вырасти до NxN метров, если ты об этом заблаговременно позаботишься. :-) Компьютерная индустрия шагала и шагает семимильными шагами.
По крайней мере, вывалиться по AV в ситуации которую ты четко знаешь и можешь предотвратить - ну это как минимум неспортивно. Ну вставь там if, скажи "Обрабатывается не более 100 таблиц" и нормально, спокойно вываливайся. AV - это самая хреновая вешь, про нее можно выдвигать сотни гипотез, собственно говоря с чего и началось юзанье твоей приблуды.
Я же предупреждал, что прогу писал под себя :)
А в этой публичной версии, кроме хелпика по F1 и автоматического создания файла конфигурации я ничего не менял.
По хорошему, надо все переделывать :)
Но эта прога выросла из попытки создать запрос для получения информации о внешних ключах таблицы, просто консольный проект на Visual C++, буквы в черном окошке. А потом переползло в графику под win32api.
Не хочу из этого моргающего г. делать конфетку, ехх, противно :) Меня оно в таком виде устраивает. Вот если с нуля....
А щас думаю пока добавить быструю навигацию по холсту на правую кнопку мыши, а то на одном экране все давно не помещается и мне лень таскать мышь к полосам прокрутки.
...
Рейтинг: 0 / 0
Как узнать: номер, имя и тип поля?
    #33536589
Gold Fish
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Штука полезная!!! Ее нужно развивать. Но ее нужно переписать на java или на С но с использованием например Qt, чтобы она была кросплатфоменная. Ну и конечно ф-ций нужно в нее добавлять. Неудобно что таблички при открытии раскладываются каскадом. При большом количестве ключей тяжело разложить.
...
Рейтинг: 0 / 0
Как узнать: номер, имя и тип поля?
    #33536733
savrock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Gold Fish ... Неудобно что таблички при открытии раскладываются каскадом. При большом количестве ключей тяжело разложить.
Согласен, но каскадом это просто реализуется, а иначе придется изобретать интеллектуальный метод позиционирования для новых таблиц, а это немного напряжно. Ведь когда новые таблицы появляются по мере их создания, по 1й - 2е штуки, то перетаскивание их на свои места не вызывает проблем.

А на счет кроссплатформенности, согласен на все 100%, если делать нормальную, то сразу такую.

Вот новая версия программы , в ней можно двигать холст правой кнопкой мыши...
...
Рейтинг: 0 / 0
Как узнать: номер, имя и тип поля?
    #33540885
Gold Fish
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нашел супер штуку. postgresql_autodoc называется. Представляет из скбя перловский скрипт, который генирирует Dia диаграмму с внешними ключами и html файлик с описанием базы
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
Как узнать: номер, имя и тип поля?
    #35136635
Фотография aov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вот случайно наткнулся на вашу прогу для схемы таблиц. хорошее дело. мне понравилось очень.
я токо не понял - у меня чёто двоится почти везде примари кей - а тут смотрю рисунки - нормально всё... или это уже новую версию чтоли перекосило немного...
и ещё есть одна проблема - у меня бд на схемы поделена - и у меня связи таблиц из разных схем тоже имеются - а они не отображаются на пикчерсе :).
а - ну и если бы типы данных тоже указывать - цены бы этой программке не было.
я долго такое что-то искал. мне не нужно править базу через схему - как в аксесе например. просто на картинку иногда в моменты особенно глубокой задумчивости охота взглянуть. а в остальном меня пгадмин вполне удовлетворяет.
а самому такое писать как-то лениво :). графика - это не наш участок. я всё больше по клиентам к бд и бд.
...
Рейтинг: 0 / 0
24 сообщений из 24, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Как узнать: номер, имя и тип поля?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]