2016-02-08 5 views

ответ

0

Проблема заключается в том, что у вас закончились типы знаков кавычек для гнезда; Разрушаяся, у нас есть:

  1. ваша оболочка должна передать одну строку команде psql; это может быть либо одинарные кавычки или двойные кавычки
  2. ваше имя таблицы смешанный случай, так должно быть в двойных кавычках
  3. ваша строка должна быть одиночными цитируемый

В примере вы даете:

psql -E --host=xxx --port=yyy --username=chi --dbname=C_DB -c 'DELETE FROM "Stock_Profile" WHERE "Symbol" = 'MSFT'; ' 

оболочка видит две одинарные кавычки строки:

  • 'DELETE FROM "Stock_Profile" WHERE "Symbol" = '
  • `'; '

Так что проблема не в psql, а в самой оболочке.

В зависимости от того, какую оболочку вы используете, строки с одним кавычком, вероятно, не принимают никаких экранов (так что \' не помогает), но, возможно, делают строки с двумя кавычками. Таким образом, вы можете попробовать использовать двойные кавычки на внешнем запросе, и избежать их вокруг имени таблицы:

psql -E --host=xxx --port=yyy --username=chi --dbname=C_DB -c "DELETE FROM \"Stock_Profile\" WHERE \"Symbol\" = 'MSFT'; " 

Теперь \" не закончится строка, так что оболочка будет рассматривать это как одну строку:

"DELETE FROM \"Stock_Profile\" WHERE \"Symbol\" = 'MSFT'; " 

и передать его в PSQL с побеги обработаны, что приводит к желаемому SQL:

DELETE FROM "Stock_Profile" WHERE "Symbol" = 'MSFT'; 
0

Это потому, что апостроф перед тем MSFT завершает строку, насколько PSQL обеспокоен.

Поскольку @imsop указывает, что чувствительность к регистру не сохраняется при удалении двойных кавычек из имен таблиц и имен столбцов, чтобы избежать двойных кавычек с обратной косой чертой (\), когда это необходимо.

psql -E --host=xxx --port=yyy --username=chi --dbname=C_DB -c "DELETE FROM \"Stock_Profile\" WHERE \"Symbol\" = 'MSFT';" 
+0

в виде двойной кавычки в данном случае не являются необязательными, предполагая те реальные таблицы и столбца п ames, потому что заглавные буквы будут складываться в нижний регистр и создавать разные имена ('stock_profile' vs' Stock_Profile', 'symbol' vs' Symbol'). Postgres - это случай * чувствительный *, но также случай * складывание *; по-видимому, нечетную комбинацию, и ее можно легко избежать, используя идентификаторы всех строчных регистров. – IMSoP

+0

ОК, всегда называли мои таблицы строчными именами, поэтому я пропустил часть о чувствительности к регистру. Я отредактирую свой ответ и займусь. – kometen

Смежные вопросы