Является ли сценарий sql приемлемым только для сервера PostgreSQL или для psql сервера и клиента?

Может ли сценарий sql интерпретироваться исключительно СУБД, такой как сервер PostgreSQL, или одновременно сервером и клиентом, например psql? Может ли сервер принять файл сценария SQL или только клиент?

Мой вопрос связан с тем, что в psql \i можно использовать для чтения и выполнения сценария sql. Но если сценарий sql приемлем для сервера Postgresql, как я могу предоставить сценарий серверу?

Как я могу написать комментарий при написании sql скрипта? # все еще используется для сигнализации комментария?

Мне нужно предоставить shebang? Если да, то стоит ли иметь шебанг, чем нет?

Спасибо.

Я пытаюсь поместить https://stackoverflow.com/a/771880/156458 в сценарий sql, чтобы я можно использовать повторно.


person Tim    schedule 15.06.2018    source источник
comment
комментарий в SQL - это /* */ или -- (многострочный и однострочный)   -  person Lukasz Szozda    schedule 15.06.2018
comment
Проще говоря: клиент SQL (psql) считывает файл в память и отправляет его на сервер, как если бы вы его набрали. А # не является допустимым символом комментария в SQL. А шебанг - это что-то специфическое для Unix (или Linux) shell и не имеет ничего общего со сценариями SQL.   -  person a_horse_with_no_name    schedule 15.06.2018
comment
@a_horse_with_no_name передает ли psql содержимое sql-скрипта на сервер, не изменяя его?   -  person Tim    schedule 15.06.2018
comment
Вы можете представить это так, да   -  person a_horse_with_no_name    schedule 15.06.2018
comment
@a_horse_with_no_name Может ли сервер принять файл сценария SQL или только клиент?   -  person Tim    schedule 15.06.2018
comment
У Postgres есть фантастическое руководство, которое может ответить на многие ваши вопросы по синтаксису. .   -  person tadman    schedule 15.06.2018
comment
@tadman спасибо. Я читаю его, но недостаточно знаком с терминологией, чтобы иногда находить полезную информацию   -  person Tim    schedule 15.06.2018


Ответы (1)


Как и многие оболочки SQL, psql имеет базовое понимание синтаксиса Postgres. Это позволяет ему определять конец оператора и направлять его на сервер для выполнения. Многим клиентам необходимо понимать синтаксис и по другим причинам, например, для выделения синтаксиса.

По умолчанию терминатор оператора ;, который может появляться в строках. Это означает, что необходим базовый синтаксический анализатор, чтобы избежать отправки неполных операторов. Этот терминатор также может изменяться, поэтому клиенту необходимо отслеживать текущий терминатор или «разделитель».

На самом деле не существует такой вещи, как автономный сценарий SQL, который можно было бы выполнять напрямую, как если бы вы это сделали для языка сценариев. У вас должна быть минимальная оболочка, которая помогает правильно подключаться к серверу, аутентифицироваться, а затем отправлять нагрузку в SQL либо с помощью перенаправления (например, do-sql < test.sql), либо с помощью таких функций, как инструмент импорта \i.

person tadman    schedule 15.06.2018
comment
Спасибо. Итак, sql-скрипт может быть принят только клиентом, а не сервером? - person Tim; 15.06.2018
comment
Является ли do-sql клиентской альтернативой psql? - person Tim; 15.06.2018
comment
SQL-скрипт - это термин, который вам действительно не следует использовать, поскольку это не совсем так. Фрагмент SQL является более подходящим, поскольку он относится к некоторым операторам SQL в файле, не более того, и подразумевает, что им нужен другой инструмент, чтобы что-то сделать. Для сравнения, скрипты - это то, что вы можете выполнять напрямую. Они не могут быть выполнены без правильного подключения клиента и сервера. Все, что может подключаться к вашему серверу и предоставлять команды SQL, считается клиентом. Сюда входят такие вещи, как драйвер Postgres, используемый в различных языках программирования. - person tadman; 15.06.2018
comment
do-sql - это просто пример сценария-оболочки, который вы можете написать. Он будет состоять из чего-то вроде psql -u myname ... и множества других опций для обеспечения правильного подключения к нужному хосту и т. Д. - person tadman; 15.06.2018
comment
Еще раз спасибо. (1) Является ли терминатор команд SQL, будь то новая строка или что-то еще, не понятным для сервера, а только для клиента? поэтому файл фрагмента SQL должен быть предоставлен клиенту, а не серверу? (2) psql принимает команды SQL только из стандартного ввода, а не из файла фрагмента SQL? Верно ли, что mysql ведет себя так же, как psql в этом аспекте? - person Tim; 15.06.2018
comment
Обычно, но не всегда, клиент идентифицирует операторы с помощью разделителя и пересылает их на сервер, используя соответствующий двоичный протокол. Теоретически клиент может использовать любой разделитель по своему усмотрению, новую строку или что-то еще, но по соглашению он обычно ; и может быть изменен по мере необходимости. Поскольку многострочные операторы встречаются часто, перевод строки встречается редко. - person tadman; 15.06.2018
comment
Поскольку сервер использует только протокол Posgres, а не необработанный SQL, вам необходимо использовать какой-нибудь клиент. psql - это тот, который поставляется с сервером, но есть много других. Они различаются по функциям, но большинство из них может обрабатывать ввод, вставленный или загруженный из файла. В обоих случаях это просто текст. - person tadman; 15.06.2018
comment
(2) Я имел в виду, что bash -c можно использовать для указания сценария оболочки в командной строке при вызове bash, в то время как psql имеет такую ​​функцию (параметр) или принимает сценарий только в stdin через его метакоманду \i? - person Tim; 15.06.2018
comment
Если вам интересно узнать о возможностях psql, это полностью задокументировано. - person tadman; 15.06.2018
comment
Да, я искал это, хотя не читал каждое слово. Я не нашел возможности для psql принять файл сценария SQL при вызове psql из оболочки - person Tim; 15.06.2018
comment
Он принимает ввод, как и любая программа командной строки. psql ... < my.sql, где my.sql - ваш файл SQL. Этот файл также может состоять из набора \i otherfile.sql директив. - person tadman; 15.06.2018
comment
Спасибо. редирекон - другой способ. Это все еще принимает ввод от stdin. Оболочка перенаправляет stdin на my.sql. В отличие от bash -c. - person Tim; 15.06.2018
comment
Поскольку сервер использует только протокол Posgres, а не необработанный SQL, вам необходимо использовать какой-либо клиент. Например, SQL и PL / pgSQL являются языками на стороне сервера, значит ли серверная сторона, что они приемлемы и понятны непосредственно на сервере? Или ваш комментарий означает, что они не в протоколе Posgres, поэтому сервер не может понимать команды SQL и PL / pgSQL? Задача клиента psql - преобразовать команды SQL и PL / pgSQL в сообщение по протоколу Posgres, а затем отправить сообщение на сервер? - person Tim; 15.06.2018
comment
Если вы читали о протоколе Postgres, который сам по себе является отдельным, если связан с набором команд SQL, он просто определяет, как передавать команды, данные и наборы результатов по соединению. У клиента есть элементарное понимание SQL, достаточное для того, чтобы обойтись, в то время как у сервера есть полное понимание SQL, чтобы действительно делать что-то полезное. Клиент формирует команды, используя протокол, и интерпретирует ответы. - person tadman; 15.06.2018
comment
Это похоже на то, как связаны HTML и HTTP, но все же разные. - person tadman; 15.06.2018
comment
Спасибо. Я обнаружил, что psql -f, похоже, тот, который принимает файл сценария sql. Хотя насчет mysql не уверен. ваше здоровье. Сделал ошибку ранее, bash -c предназначен для приема команд bash как встроенного скрипта, то есть аргументов командной строки - person Tim; 15.06.2018