двойные кавычки вокруг дефисного имени таблицы терпят неудачу - PullRequest
0 голосов
/ 08 июня 2018

Мы используем программное обеспечение SaaS для извлечения наших маркетинговых данных из облака.Когда я пытаюсь вывести результат запроса в CSV-файл, например,

psql my.server -p 5432 -U myuser -d mydb -c "\copy (SELECT 
c.*,cip.*,cipi.* FROM saas.contacts c LEFT JOIN 
saas."contacts__identity-profiles" cip ON 
cip."_sdc_source_key_vid" = c.vid LEFT JOIN 
saas."contacts__identity-profiles__identities" cipi ON 
cipi."_sdc_source_key_vid" = cip."_sdc_source_key_vid" AND 
cipi."_sdc_level_0_id" = cip."_sdc_level_0_id") to 
'/tmp/contacts.csv' DELIMITER ',' CSV HEADER "

Сбой при следующей ошибке

ERROR:  syntax error at or near "-"
LINE 1: ...EFT JOIN saas.contacts__identity-profiles ...

Я знаю, что Postgres требует, чтобы я заключил двойные кавычкиимена таблиц через дефис, но это, очевидно, не работает.Я пытался

  • экранировать дефис в имени таблицы следующим образом "contacts__identity\-profiles", но безрезультатно
  • удваивать двойные кавычки вокруг имени таблицы, но безрезультатно.

Проблема, похоже, связана с использованием двойных кавычек внутри команды COPY.Как я могу обойти это?

Ответы [ 2 ]

0 голосов
/ 08 июня 2018

Вы можете попробовать поместить полную команду в одинарные кавычки, а затем использовать двойные кавычки внутри для других целей следующим образом:

psql my.server -p 5432 -U myuser -d mydb -c '\copy (SELECT 
c.*,cip.*,cipi.* FROM saas.contacts c LEFT JOIN 
saas."contacts__identity-profiles" cip ON 
cip."_sdc_source_key_vid" = c.vid LEFT JOIN 
saas."contacts__identity-profiles__identities" cipi ON 
cipi."_sdc_source_key_vid" = cip."_sdc_source_key_vid" AND 
cipi."_sdc_level_0_id" = cip."_sdc_level_0_id") to 
"/tmp/contacts.csv" DELIMITER "," CSV HEADER '

Надеюсь, это поможет !!

0 голосов
/ 08 июня 2018

У вас есть двойные кавычки, делающие две разные вещи одновременно:

  • Внешние двойные кавычки предназначены для bash для передачи этой команды psql в качестве одного аргумента.
  • Внутренние двойные кавычки предназначены для PostgreSQL, так что вы можете заключать в кавычки ваши идентификаторы дефисов.

Вам нужно экранировать внутренние кавычки, чтобы получить их через bash и в psql:

psql my.server -p 5432 -U myuser -d mydb -c "... saas.\"contacts__identity-profiles\" ..."
# ----------------------------------------------------^^ ------------------------- ^^

и так далее.Если убрать их всех (из bash), вы получите:

psql my.server -p 5432 -U myuser -d mydb -c "\copy (SELECT c.*,cip.*,cipi.* FROM saas.contacts c LEFT JOIN saas.\"contacts__identity-profiles\" cip ON cip.\"_sdc_source_key_vid\" = c.vid LEFT JOIN saas.\"contacts__identity-profiles__identities\" cipi ON cipi.\"_sdc_source_key_vid\" = cip.\"_sdc_source_key_vid\" AND cipi.\"_sdc_level_0_id\" = cip.\"_sdc_level_0_id\") to '/tmp/contacts.csv' DELIMITER ',' CSV HEADER "
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...