Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / И всё-таки, как проверить существование таблицы? / 11 сообщений из 11, страница 1 из 1
31.03.2008, 11:25
    #35223853
Ega
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
31.03.2008, 12:25
    #35224078
drunk2
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
И всё-таки, как проверить существование таблицы?
...
Рейтинг: 0 / 0
31.03.2008, 12:44
    #35224151
Ega
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
31.03.2008, 15:59
    #35224922
Ega
Ega
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
И всё-таки, как проверить существование таблицы?
Хорошо. Тогда такой вопрос:
есть cmd-скрипт, который обновляет БД до определённой версии. Номер версии хранится в той же БД.
Вопрос: каким образом его получить в переменную cmd-скрипта?

т.е. что-то типа:
Код: plaintext
1.
2.
set DBVerNumb= 0 
psql -h ... -p ... -d ... -c "select DBVerNumb from ...."
вот как результат запроса в %DBVerNumb% получить?
...
Рейтинг: 0 / 0
01.04.2008, 10:26
    #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
01.04.2008, 10:44
    #35226454
Ega
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
01.04.2008, 11:07
    #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
01.04.2008, 11:38
    #35226665
Ega
Ega
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
И всё-таки, как проверить существование таблицы?
Это bash
У меня-то виндовозовский cmd-shell...
...
Рейтинг: 0 / 0
01.04.2008, 11:43
    #35226689
Dan Black
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
И всё-таки, как проверить существование таблицы?
EgaЭто bash
У меня-то виндовозовский cmd-shell...Установите какой-нибудь скриптовый язык, и будет Вам счастье :)
...
Рейтинг: 0 / 0
01.04.2008, 11:54
    #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
01.04.2008, 12:24
    #35226850
Ega
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
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / И всё-таки, как проверить существование таблицы? / 11 сообщений из 11, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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