Имея эту ошибку psql: «дополнительный аргумент командной строки игнорируется» [дубликат]

1) Так называемая проблема «Mutable Default Argument» - это, в общем, специальный пример, демонстрирующий, что: «Все функции с этой проблемой также страдают от аналогичной проблемы побочного эффекта от фактического параметра». Это противоречит правилам

Пример:

def foo(a=[]):                 # the same problematic function
    a.append(5)
    return a

>>> somevar = [1, 2]           # an example without a default parameter
>>> foo(somevar)
[1, 2, 5]
>>> somevar
[1, 2, 5]                      # usually expected [1, 2]

Решение: копия Совершенно безопасным решением является copy или deepcopy входной сигнал сначала, а затем делать все с копией.

def foo(a=[]):
    a = a[:]     # a copy
    a.append(5)
    return a     # or everything safe by one line: "return a + [5]"

Многие встроенные изменяемые типы имеют метод копирования, такой как some_dict.copy() или some_set.copy(), или могут быть скопированы легко, как somelist[:] или list(some_list) , Каждый объект также может быть скопирован с помощью copy.copy(any_object) или более тщательным с помощью copy.deepcopy() (последний полезен, если изменяемый объект состоит из изменяемых объектов). Некоторые объекты основаны на побочных эффектах, таких как «файл», и не могут быть осмысленно воспроизведены копией. копирование

Пример проблемы для аналогичного вопроса SO

class Test(object):            # the original problematic class
  def __init__(self, var1=[]):
    self._var1 = var1

somevar = [1, 2]               # an example without a default parameter
t1 = Test(somevar)
t2 = Test(somevar)
t1._var1.append([1])
print somevar                  # [1, 2, [1]] but usually expected [1, 2]
print t2._var1                 # [1, 2, [1]] but usually expected [1, 2]

Он не должен быть ни сохранен ни в одном ] public экземпляра, возвращаемого этой функцией. (Предполагая, что атрибуты private экземпляра не должны быть изменены извне этого класса или подкласса по соглашению, т. Е. _var1 является частным атрибутом)

Заключение: Параметры входных параметров shouldn 'изменяются на месте (мутированные), и они не должны быть привязаны к объекту, возвращаемому функцией. (Если мы предпочитаем программирование без побочных эффектов, которые настоятельно рекомендуются, см. Wiki о «побочном эффекте» (первые два абзаца имеют смысл в этом контексте.).)

2) Только если побочный эффект на фактический параметр требуется, но нежелателен по параметру по умолчанию, тогда полезным решением является def ...(var1=None): if var1 is None: var1 = [] Подробнее ..

3) В некоторых случаях используется изменчивое поведение параметров по умолчанию .

183
задан Flimzy 19 June 2011 в 22:20
поделиться

5 ответов

  • в одной строке:
    export PGPASSWORD='password'; psql -h 'server name' -U 'user name' -d 'base name' -c 'command'
    
    с командой команда sql, такая как "select * from schema.table"
  • или более читаемая:
    export PGPASSWORD='password'
    psql -h 'server name' -U 'user name' -d 'base name' \
         -c 'command' (eg. "select * from schema.table")
    
73
ответ дан AdrieanKhisbe 21 August 2018 в 11:12
поделиться
  • 1
    Одна строка может быть слегка упрощена до: PGPASSWORD='password' psql ...., которая также имеет преимущество в том, что переменная недоступна после выполнения команды. – Garrett 13 January 2016 в 22:36
  • 2
    export PGPASSWORD=YourNewPassword работал для меня по другим вариантам. – Mikeumus 4 April 2016 в 04:38
  • 3
    export PGPASSWORD звучит как действительно плохая идея – hasen 28 August 2017 в 10:38
  • 4
    Это сохранит пароль в вашем файле истории bash ~ / .bash_history (если вы не всегда всегда добавляете предыдущее пространство), а также экспортируйте пароль в текущую среду FWIW: | – rogerdpack 20 December 2017 в 21:34

В Windows:

  1. Назначить значение PGPASSWORD: C:\>set PGPASSWORD=pass
  2. Команда запуска: C:\>psql -d database -U user

Готов

Или в одной строке,

set PGPASSWORD=pass&& psql -d database -U user

Обратите внимание на недостаток места перед & amp; & amp; & amp; !

10
ответ дан Brian Burns 21 August 2018 в 11:12
поделиться
  • 1
    Я пробовал это, и это не сработало. Все еще спрашивают пароль. – antipattern 19 October 2017 в 09:11
  • 2
    Работала хорошо для меня - psql версия 10.3 – Brian Burns 4 March 2018 в 15:59
  • 3
    @antipattern Вы также должны передать опцию -w. – mljrg 27 July 2018 в 11:03

Я предпочитаю передавать URL-адрес в psql:

psql "postgresql://$DB_USER:$DB_PWD@$DB_SERVER/$DB_NAME"

Это дает мне право называть мои переменные среды по своему усмотрению и позволяет избежать создания ненужных файлов.

требуется libpq. Документацию можно найти здесь здесь

5
ответ дан Jacques Gaudin 21 August 2018 в 11:12
поделиться

Это можно сделать, создав файл .pgpass в домашнем каталоге пользователя (Linux). .pgpass формат файла:

<databaseip>:<port>:<databasename>:<dbusername>:<password>

Вместо деталей вы можете использовать wild card *.

Скажем, я хотел запустить tmp.sql без запроса пароля ,

С помощью следующего кода вы можете в * .sh файле

echo "192.168.1.1:*:*:postgres:postgrespwd" > $HOME/.pgpass
echo "` chmod 0600 $HOME/.pgpass `"

echo " ` psql -h 192.168.1.1 -p 5432  -U postgres  postgres  -f tmp.sql `        
17
ответ дан jonsca 21 August 2018 в 11:12
поделиться
  • 1
    Какой смысл эха? `Chmod 0600 $ HOME / .pgpass` & quot ;? Как насчет только chmod 0600 $ HOME / .pgpass? – Vlad Patryshev 27 March 2014 в 19:46

Установите переменную среды PGPASSWORD внутри скрипта перед вызовом psql

PGPASSWORD=pass1234 psql -U MyUsername myDatabaseName

. Для справки см. http://www.postgresql.org/docs/current/static/libpq-envars .html


Редактировать

Поскольку Postgres 9.2 также имеет возможность указать строку соединения или URI , которая может содержать имя пользователя и пароль.

Использование этого является угрозой безопасности, поскольку пароль отображается в виде обычного текста при просмотре командной строки текущего процесса, например. используя ps (Linux), ProcessExplorer (Windows) или аналогичные инструменты другими пользователями.

См. также этот вопрос в Администраторы базы данных

353
ответ дан rogerdpack 21 August 2018 в 11:12
поделиться
  • 1
    Спасибо, я знаю о pgpass, но это не решает проблему. Мне нужен автономный скрипт bash для работы над базой данных, поэтому мой вопрос о передаче информации в psql через командную строку. – Alex N. 19 June 2011 в 22:17
  • 2
    Я думаю, что ваш единственный вариант - создать файл .pgpass, к которому имеет доступ ваш скрипт bash. Или вообще не используйте пароли - вы можете настроить другую форму аутентификации, такую ​​как идентификатор или использование сертификатов SSL. – Flimzy 19 June 2011 в 22:19
  • 3
    Вот чего я боялся :) Спасибо за информацию! – Alex N. 19 June 2011 в 22:21
  • 4
    Другой вариант - использовать ожидание. Но я действительно ненавижу ожидать :) – Flimzy 19 June 2011 в 22:25
  • 5
    Например, в одной строке вы можете сделать что-то вроде: PGPASSWORD = pass1234 psql -u MyUsername myUserName – andyortlieb 12 September 2013 в 19:05
  • 6
    Я думаю, что это самый удобный способ простого запуска SQL-скрипта. – zr870 21 May 2014 в 18:42
  • 7
    Я могу только добавить - добавить space в командной строке перед первым символом, и команда не будет сохранена в истории bash. Работает для ubuntu / bash. – baldr 15 October 2016 в 18:01
  • 8
    См. Комментарий ниже о PGPASSWORD. По-видимому, это не так безопасно, так как его можно обнюхать, выкапывая в / proc, я думаю, но он работает очень хорошо. – Steve Byrne 11 March 2017 в 02:20
  • 9
    БОНУС: работает для Докера: docker run -e PGPASSWORD="$(pbpaste)" --rm postgres psql -h www.example.com dbname username -c 'SELECT * FROM table;' – Bilal Akil 23 November 2017 в 05:34
  • 10
    Будьте осторожны и обязательно добавьте предыдущее пространство , иначе оно появится в вашем файле истории bash ~ / .bash_history ... – rogerdpack 20 December 2017 в 21:32
Другие вопросы по тегам:

Похожие вопросы: