powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / И всё-таки, как проверить существование таблицы?
11 сообщений из 11, страница 1 из 1
И всё-таки, как проверить существование таблицы?
    #35223853
Ega
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Где - понятно, Select from pg_tables.
Интересует другой вопрос: мне что, действительно для каждой таблицы придётся свою функцию писать?
Задача такова: пользуясь только командной строкой (psql) пропатчить БД до определённой версии. Для этого нужно выполнить некоторое количество команд, типа
Код: plaintext
1.
if not exists (select  1  from pg_tables where tablename=...) then
  create table ....();

Я всё никак не могу понять: в каком контексте мне такие скрипты надо запускать?
Через psql -c"...." такое "прокатит" или нет?
...
Рейтинг: 0 / 0
И всё-таки, как проверить существование таблицы?
    #35224078
drunk2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
И всё-таки, как проверить существование таблицы?
    #35224151
Ega
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
drunk2 вот так

Ну такой вариант понятен.
Вот, написал примерно такое:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
CREATE OR REPLACE FUNCTION s_check_table(
  table_name text,
  ddl_text text)
  RETURNS text AS
$BODY$
begin
  if not exists (select  1  from pg_tables where tablename=table_name) 
  then
    execute ddl_text;
    return 'Table created: ' || table_name;
  end if;

 return '';
end$BODY$
  LANGUAGE 'plpgsql' VOLATILE
  COST  100 ;
ALTER FUNCTION sp_test(text) OWNER TO sa;

Просто вопрос такой: это кроме как в контексте plpgsql-функции никак сделать нельзя?
А то уж больно некрасивый скрипт на создание БД получается...
...
Рейтинг: 0 / 0
И всё-таки, как проверить существование таблицы?
    #35224922
Ega
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хорошо. Тогда такой вопрос:
есть cmd-скрипт, который обновляет БД до определённой версии. Номер версии хранится в той же БД.
Вопрос: каким образом его получить в переменную cmd-скрипта?

т.е. что-то типа:
Код: plaintext
1.
2.
set DBVerNumb= 0 
psql -h ... -p ... -d ... -c "select DBVerNumb from ...."
вот как результат запроса в %DBVerNumb% получить?
...
Рейтинг: 0 / 0
И всё-таки, как проверить существование таблицы?
    #35226393
LeXa NalBat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
в линуксе через обратные кавычки
Код: plaintext
1.
2.
nalbat@nalbat:~$ PGSQL_VERSION=`psql -A -t -c 'select version()'`
nalbat@nalbat:~$ echo $PGSQL_VERSION
PostgreSQL  8 . 3 . 0  on x86_64-unknown-linux-gnu, compiled by GCC gcc (GCC)  4 . 2 . 1  (SUSE Linux)
...
Рейтинг: 0 / 0
И всё-таки, как проверить существование таблицы?
    #35226454
Ega
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LeXa NalBatв линуксе через обратные кавычки
Код: plaintext
1.
2.
nalbat@nalbat:~$ PGSQL_VERSION=`psql -A -t -c 'select version()'`
nalbat@nalbat:~$ echo $PGSQL_VERSION
PostgreSQL  8 . 3 . 0  on x86_64-unknown-linux-gnu, compiled by GCC gcc (GCC)  4 . 2 . 1  (SUSE Linux)


о как...
А в переменную попадает, как я понял, то, что в STDOUT содержится, да?
...
Рейтинг: 0 / 0
И всё-таки, как проверить существование таблицы?
    #35226549
LeXa NalBat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
EgaА в переменную попадает, как я понял, то, что в STDOUT содержится, да?да man bash Command Substitution

Command substitution allows the output of a command to replace the command name. There are two forms:

$(command)
or
`command`

Bash performs the expansion by executing command and replacing the command substitution with the standard output of the command, with any trailing newlines
deleted. Embedded newlines are not deleted, but they may be removed during word splitting. The command substitution $(cat file) can be replaced by the
equivalent but faster $(< file).

When the old-style backquote form of substitution is used, backslash retains its literal meaning except when followed by $, `, or \. The first backquote
not preceded by a backslash terminates the command substitution. When using the $(command) form, all characters between the parentheses make up the com-
mand; none are treated specially.

Command substitutions may be nested. To nest when using the backquoted form, escape the inner backquotes with backslashes.

If the substitution appears within double quotes, word splitting and pathname expansion are not performed on the results.
...
Рейтинг: 0 / 0
И всё-таки, как проверить существование таблицы?
    #35226665
Ega
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Это bash
У меня-то виндовозовский cmd-shell...
...
Рейтинг: 0 / 0
И всё-таки, как проверить существование таблицы?
    #35226689
Dan Black
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
EgaЭто bash
У меня-то виндовозовский cmd-shell...Установите какой-нибудь скриптовый язык, и будет Вам счастье :)
...
Рейтинг: 0 / 0
И всё-таки, как проверить существование таблицы?
    #35226746
ЯЕХХ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Как вам это? (чистый psql, на винде работает)
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
postgres# drop table if exists version;
DROP TABLE
postgres# create table version(v int);
CREATE TABLE
postgres# insert into version values ( 80301 );
INSERT  0   1 
postgres# \t on
Showing only tuples.
postgres# \o version.tmp
postgres# select '\set APPVERSION '||v from version;
postgres# \o
postgres# \i version.tmp
postgres# select 'my version = ' || :APPVERSION;
 my version =  80301 
Может кто проще способ знает, и чтобы без записи файла? Боюсь не всегда в текущий каталог запись разрешена...
...
Рейтинг: 0 / 0
И всё-таки, как проверить существование таблицы?
    #35226850
Ega
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЯЕХХКак вам это? (чистый psql, на винде работает)
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
postgres# drop table if exists version;
DROP TABLE
postgres# create table version(v int);
CREATE TABLE
postgres# insert into version values ( 80301 );
INSERT  0   1 
postgres# \t on
Showing only tuples.
postgres# \o version.tmp
postgres# select '\set APPVERSION '||v from version;
postgres# \o
postgres# \i version.tmp
postgres# select 'my version = ' || :APPVERSION;
 my version =  80301 
Может кто проще способ знает, и чтобы без записи файла? Боюсь не всегда в текущий каталог запись разрешена...

Это интересно. Буду думать. Спасибо. :)
...
Рейтинг: 0 / 0
11 сообщений из 11, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / И всё-таки, как проверить существование таблицы?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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