LINUX.ORG.RU
ФорумAdmin

Не могу создать таблицу в pgadmin3

 , , ,


0

2

Установил базу данных postgresql13. установил pgadmin3. Создал базу данных.

Хочу создать таблицу в базе данных lesson, но вылазит ошибка. Мне нужно сделать именно так, как я это делал в mysql/phpmyadmin. Потому что там у меня работало, а postgre я раньше не использовал. Прошу помочь.

На phpmyadmin выглядела таблица, которую я создавал таким образом:

ИмяТипДлина/ЗначенияПо умолчаниюСравнениеАтрибутыNullИндексA_IКомментарии
user_idINT11Нет PrimaryA_I
usernameVARCHAR60Нетutf8_general_ci
passwordVARCHAR60Нетutf8_general_ci

На pgadmin3 таблица выглядит так:

ColumnТипДлина/ЗначенияNot NullУникальный ключПервичный ключПо умолчаниюКомментарии
user_idinteger11Да Да
usernamecharacter varying60Да
passwordcharacter varying60Да

Ошибка выглядит так:

Ошибка SQL:

ERROR:  syntax error at or near "("
LINE 1: CREATE TABLE "public"."signup" ("user_id" integer(11), "user...
                                                         ^
В операторе:
CREATE TABLE "public"."signup" ("user_id" integer(11), "username" character varying(60), "password" character varying(60), PRIMARY KEY ("user_id")) WITHOUT OIDS

Пробовал через postgre в консоли, тоже самое:

postgres=# CREATE TABLE signup (
    user_id                     int(11) PRIMARY KEY,
    username            character varying(60),          
    password            character varying(60),
);
ERROR:  syntax error at or near "("
СТРОКА 2:     user_id   int(11) PRIMARY KEY,
                           ^

Да, я вижу, что проблема где-то с последовательным типом данных. Я пробовал заменить на SERIAL , но в любом случае после создания таблицы не было доступа к бд/таблице. ЧЯДНТ?

//Тег freebsd будет лишним, но если это важно, то события происходят на ос freebsd в jail, все это на устройстве raspberry_pi. В моём случае pgadmin4/phppgadmin конфликтует с бинарными пакетами малины, которые были собраны заранее для nginx и другого добра, поэтому я поставил именно pgadmin3.

★★★★★

Последнее исправление: Clockwork (всего исправлений: 2)
CREATE TABLE signup (
    user_id             BIGSERIAL PRIMARY KEY,
    username            VARCHAR(60),          
    password            VARCHAR(60),
);

ну или так

Noob_Linux ★★★★
()
Последнее исправление: Noob_Linux (всего исправлений: 3)

INT(11)

Это в mysql уже много лет deprecated, если уже не выкинули.

gremlin_the_red ★★★★★
()

Ругается же на скобку прямым текстом, убери (11), оно только на визуальное оформление влияло в mysql. Если что я pgsql ни разу вживую не видел.

firkax ★★★★★
()
Ответ на: комментарий от firkax

Ругается же на скобку прямым текстом, убери (11)

Удваиваю! Иди в справку по PostgreSQL DDL для 13-той версии. Там все типы данных написаны.

pup_kin
()
Ответ на: комментарий от pup_kin

Доступные типы данных я итак вижу в веб интерфейсе. Очевидно, что вместо INT используется integer.

Убрал ‘(11)’ и таблица создалась. Только я не уверен, что структуру таблицы создал правильно.

Clockwork ★★★★★
() автор топика
Ответ на: комментарий от Clockwork

Доступные типы данных я итак вижу в веб интерфейсе …

… Убрал ‘(11)’ и таблица создалась …

Строго говоря - (11) это часть спецификации типа.

pup_kin
()
Последнее исправление: pup_kin (всего исправлений: 1)
Ответ на: комментарий от gremlin_the_red

Тогда я не правильно что-то делаю, потому-что страница не может сделать запись в бд.

При импорте базы из mysql вылазит вот такой error

signup.csv:2: ERROR: syntax error at or near ""1""
LINE 1: "1","abc","40bd001563085f3d5165329ea1ff58s2ybdbbeef"
^
Время выполнения: 1.595 мсек

SQL-запрос выполнен.

При выполнении скрипта sql такая картина:

signup.sql:10: ERROR: unrecognized configuration parameter "sql_mode"
signup.sql:11: ERROR: unrecognized configuration parameter "autocommit"
START TRANSACTION
signup.sql:13: ERROR: unrecognized configuration parameter "time_zone"
signup.sql:16:
signup.sql:17:
signup.sql:18:
signup.sql:19:
signup.sql:35: ERROR: syntax error at or near "`"
LINE 1: CREATE TABLE `signup` (
^
signup.sql:42: ERROR: syntax error at or near "`"
LINE 1: INSERT INTO `signup` (`user_id`, `username`, `password`) VAL...
^
signup.sql:52: ERROR: syntax error at or near "`"
LINE 1: ALTER TABLE `signup`
^
signup.sql:62: ERROR: syntax error at or near "`"
LINE 1: ALTER TABLE `signup`
^
ROLLBACK
signup.sql:65:
signup.sql:66:
signup.sql:67:
Время выполнения: 14.655 мсек

SQL-запрос выполнен.
Clockwork ★★★★★
() автор топика
Последнее исправление: Clockwork (всего исправлений: 1)
Ответ на: комментарий от Clockwork

signup.sql:10: ERROR: unrecognized configuration parameter «sql_mode»
signup.sql:11: ERROR: unrecognized configuration parameter «autocommit»
signup.sql:13: ERROR: unrecognized configuration parameter «time_zone»

Мусины слова. Можете забить или для шелковистости волос убрать/закомментировать.

CREATE TABLE `signup`
ALTER TABLE `signup`
INSERT INTO `signup` (`user_id`, `username`, `password`)

Тут тоже муськина фишка в виде символа ` его надо убрать. Но вот каким образом это сделать, решать вам, способов мульон. Обращаю внимание, что символ ` может внезапно встретиться к каком-то текстовом поле, поэтому вариант удаления всех символов ` не лучшая идея.

anc ★★★★★
()
Ответ на: комментарий от theNamelessOne

вспоминая, джангу и эти вечно кривые миграции….

tz4678 ★★
()
  1. поставь docker-compose
  2. создай конфиг ~/path/to/compose/docker-compose.yml:
version: '3.8'

# для имен используем kebab, тк к имени через underscore добавляется название
# каталога, в котором находится конфиг

# Отключаем CoW для увеличения производительности:
# $ chattr -C ./data
services:
  postgres:
    container_name: postgres
    image: postgres:alpine
    env_file: .env
    networks:
      - internal
    ports:
      - '5432:5432'
    # always перезапустит даже остановленные через stop
    restart: unless-stopped
    volumes:
      - ./data/postgres:/var/lib/postgresql/data:rw

  pgadmin:
    container_name: pgadmin
    image: dpage/pgadmin4
    depends_on:
      - postgres
    env_file: .env
    networks:
      - internal
    ports:
      - "5050:80"
    restart: unless-stopped
    volumes:
      - ./data/pgadmin:/var/lib/pgadmin:rw

  redis:
    container_name: redis
    image: redis:alpine
    networks:
      - internal
    ports:
      - "6379:6379"
    restart: unless-stopped
    volumes:
      - ./data/redis:/var/lib/redis:rw

# Постоянное хранение данных
# Именнованные вольюмы хранятся в /var/lib/docker/volumes, но так как снапшоты
# /var/lib/docker не делаются, то критичные данные лучше хранить в ./data
# volumes:
  # pgadmin-data:
  # pgdata:
  # redis-data:

networks:
  internal:
  1. Создай каталог для данных базы:
mkdir ~/path/to/compose/data
  1. Запусти все базы в докере:
cd ~/path/to/compose
docker-compose up -d
# обратная операция
docker-compose down
tz4678 ★★
()
Ответ на: комментарий от tz4678

Бесполезный ответ, так как у автора вопроса проблема из-несовместимости синтаксиса SQL и типов данных между MySQL и PostgreSQL.

Что можно сделать. В pgpAdmin есть мастер создания таблиц, который позволяет не писать SQL оператор создания таблицы (получившийся оператор можно посмотреть по Scripts - Create). Правой кнопкой мыши по Tables, затем Create. Обязательно посмотреть описание типов данных PostgreSQL. Есть на русском языке. Типы целое число и строка можно без особого ущерба для работы указывать без точности: integer и text. Обратить внимание на типы даты-времени. Если в названиях таблиц и колонок есть большие буквы, то в SQL операторах помещать их в " " (а '' используются для строковых значений).

В Linux по умолчанию ставится pgAdnin3, но вообще-то, есть смысл использовать pgAdmin4, особенно если дисплей с мелким пикселом. Хотя на вышеприведённые рекомендации это не влияет.

Partisan ★★★★★
()
Ответ на: комментарий от Partisan

ну то что он через жопу софт ставит нужно, конечно, оставить без внимания, пускай страдает как дебиано-петухи с докерофобией?

tz4678 ★★
()
Последнее исправление: tz4678 (всего исправлений: 1)
Ответ на: комментарий от Partisan

В Linux по умолчанию ставится pgAdnin3

Linux это лишь ядро. В разных дистрибутивах… ну ты понЕл:

~ 
➜ yay -Ss pgadmin 
Found existing alias for "yay -Ss". You should use: "yareps"
aur/phppgadmin-relhasoids 7.12.1-1 (+0 0.00) 
    The premier web-based administration tool for postgresql
aur/pgadmin3 1.22.2-9 (+2 0.00) 
    Comprehensive design and management interface for PostgreSQL (legacy)
aur/postage-bin 3.2.9-2 (+3 0.00) (Out-of-date: 2017-06-01) 
    Postage - A fast replacement for PGAdmin
aur/pgmanage-bin 11.0.1-2 (+4 0.00) 
    pgManage - A fast alternative to PGAdmin
aur/pgagent 4.0.0-1 (+4 0.00) 
    Job scheduler for PostgreSQL which may be managed using pgAdmin
community/phppgadmin 7.13.0-2 (617.0 KiB 3.2 MiB) 
    A web-based administration tool for PostgreSQL
community/pgadmin4 4.30-3 (30.7 MiB 118.4 MiB) 
    Comprehensive design and management interface for PostgreSQL

У меня в дистре последний, третий из АУРА, те тот который не нужен с точки зрения ментейнеров. Но я не ставлю постгрессы и прочие тулзы для работы с базами из репозитория. IN REAL Word ты вынужден работать с определенными версиями Postgres и как правило кучей разных чтобы потом не словить былинный отказ.

tz4678 ★★
()
Ответ на: комментарий от tz4678

А ПОТОМУ только Docker спасет отца русской демократии. Вы тут все разной степени упоротости. У меня был на работе чувак, который утверждал, что докер это небезопасно, он не нужен… По иронии судьбы благодаря этому человеку я стал программистом, в далеком 2009 году он был разработчиком сайта spaces.ru, где была куча багов, которые позволяли, например, получать доступ к чужим сессиям. И вот со взлома этого сайта и началось мое изучение программирования… А через 10 лет мы оказались в одной конторе, и он до сих пор не знает, что благодаря ему я стал (кем стал)… В общем быть ретроградом не круто.

tz4678 ★★
()
Ответ на: комментарий от tz4678

Бессмысленный ответ. Docker не решает проблемы автора вопроса. А pgAdmin3 вообще нельзя использовать в Docker-е, так как у него графический интерфейс (pgAdmin4 должен работать, так имеет веб-иниерфейс, но шли бы вы с вашим Docker-ом, как не относящимся к теме).

Partisan ★★★★★
()
Ответ на: комментарий от tz4678

А то что там автор не осилил почитать различия в синтаксисе между MySQL и Postgres не так уж и важно. Найти автоконвертер он осилил бы.

tz4678 ★★
()
Ответ на: комментарий от tz4678

Так у вас ещё и Arch Linux. Не подходит для работы, так как является непрерывно обновляемым дистрибутивом. В общем, кто не умеет сам, тот учит других.

Partisan ★★★★★
()
Ответ на: комментарий от tz4678

ну то что он через жопу софт ставит нужно, конечно, оставить без внимания

Интересно стало, с чего ты взял что я софт ставил через жопу?

Спасибо за наводку про докер для миграции, но как сказал Partisan, проблема была не в этом.

Clockwork ★★★★★
() автор топика
Ответ на: комментарий от theNamelessOne

Это казалось бы очевидным, но проблема заключалась именно в первой строчке таблицы, в одном параметре. Если бы замена синтаксиса решила проблему, я бы не задавался столь тупым вопросом.

Я стал вчера разбираться и смотреть в логи nginx по поводу проблемы с бд. В результате у меня все завелось.

Главная проблема была в не правильно созданной таблице, где первое значение из-за параметра NULL не могло быть записано. Ругалось, конечно же, на INT.

Clockwork ★★★★★
() автор топика
Ответ на: комментарий от Partisan

вообще-то, есть смысл использовать pgAdmin4

Установил все таки pgAdmin4, также решил попробовать еще phppgadmin. pgAdmin4 работает через браузер, это было полезно для меня при установленном софте на сервер без графического окружения. Вот только включать сам веб-интерфейс можно только через активированную виртуальную среду. А phppgadmin оказался аналогом phpMyAdmin для PostgreSQL. Он был удобным дополнительным вариантом без лишних усилий.

Для решения проблемы я создал в phppgadmin таблицу таким образом:

ColumnТипДлина/ЗначенияNOT NULLУникальный ключПервичный ключ
user_idSERIAL
usernamecharacter varying60
passwordcharacter varying60

В свойствах pgadmin4 таблицы содержание стало таким:

ИмяТип ДанныхLength/PrecisionМасшНе NULL?ПервичныйПо умолчанию
user_idinteger + nextval(‘signup_user_id_seq’::regclass)
usernamecharacter varying60
passwordcharacter varying60

//Еще мне пришлось в php поменять значения для совместимости с Postgre, но тут я сам виноват, понимаю.

Clockwork ★★★★★
() автор топика
Ответ на: комментарий от theNamelessOne

Твою проблему с ошибками решили бы 15 минут, проведенных на сайте документации PostgreSQL.

Спасибо за помощь в этом треде. Хвастаться своими рекордами потом будешь!

Clockwork ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.