sql 脚本是仅由 PostgreSQL 服务器接受,还是由服务器和客户端 psql 接受?
Posted
技术标签:
【中文标题】sql 脚本是仅由 PostgreSQL 服务器接受,还是由服务器和客户端 psql 接受?【英文标题】:Is a sql script acceptable solely by PostgreSQL server, or by both server and client psql? 【发布时间】:2018-11-25 10:44:42 【问题描述】:一个 sql 脚本是只能由 RDBMS(如 PostgreSQL 服务器)解释,还是由服务器和客户端(如 psql)解释?服务器可以接受 SQL 脚本文件,还是只有客户端可以?
我的问题来自学习在 psql 中,\i
可用于读取和执行 sql 脚本。但是如果一个 sql 脚本可以被 Postgresql 服务器接受,我该如何将脚本提供给服务器呢?
写sql脚本的时候,怎么写注释呢? #
是否仍用于发送评论?
我需要提供shebang吗?如果是的话,有一个shebang是不是一个好主意?
谢谢。
我正在尝试将https://***.com/a/771880/156458 放入一个 sql 脚本中,以便我可以重复使用它。
【问题讨论】:
SQL 中的注释为/* */
或--
(多行和单行)
简单地说:SQL 客户端 (psql
) 将文件读入内存并将其发送到服务器,就像您键入它一样。而#
是不是 SQL 中的有效注释字符。而“shebang”是 Unix(或 Linux)shell
特有的东西,与 SQL 脚本无关。
你可以这样想象,是的
Postgres 有一个fantastic manual 可以回答你的很多语法问题。
@tadman 谢谢。我正在阅读它,但对术语不够熟悉,有时无法找到有用的信息
【参考方案1】:
与许多 SQL shell 一样,psql
对 Postgres 语法有基本的了解。这允许它识别语句的结尾并将其转发到服务器以供执行。许多客户还需要理解语法还有其他原因,比如语法高亮。
默认的语句终止符是;
,它可以出现在字符串中。这意味着需要一个基本的解析器来避免发送不完整的语句。此终止符也可以更改,因此客户端需要跟踪当前终止符或“分隔符”是什么。
确实没有像使用脚本语言那样可以直接执行的独立 SQL 脚本。您应该有一个最小的包装器来帮助正确连接到服务器、进行身份验证,然后通过使用重定向(例如 do-sql < test.sql
)或 \i
导入工具等功能在 SQL 中发送负载。
【讨论】:
谢谢。那么一个sql脚本只能被客户端接受,不能被服务器接受?do-sql
是 psql
的客户端替代品吗?
“SQL 脚本”是一个你真的不应该使用的术语,因为它不是一个真正的东西。 “SQL sn-p”更合适,因为它指的是文件中的一些SQL语句,仅此而已,并暗示它们需要另一个工具才能做某事。相比之下,脚本是可以直接执行的。如果没有正确连接在一起的客户端和服务器,它们就无法执行。任何可以连接到您的服务器并提供 SQL 命令的东西都被视为客户端。这包括各种编程语言中使用的 Postgres 驱动程序。
do-sql
只是您可能编写的包装脚本的一个示例。它将由psql -u myname ...
之类的内容和许多其他选项组成,以确保它正确连接到正确的主机等。
谢谢。我发现psql -f
似乎是接受 sql 脚本文件的那个。不过不确定mysql
。干杯。之前犯了一个错误,bash -c
用于接受 bash 命令作为内联脚本,即命令行参数以上是关于sql 脚本是仅由 PostgreSQL 服务器接受,还是由服务器和客户端 psql 接受?的主要内容,如果未能解决你的问题,请参考以下文章
从 Django 创建 SQL 插入脚本以填充 PostgreSQL 数据库