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-sqlpsql 的客户端替代品吗? “SQL 脚本”是一个你真的不应该使用的术语,因为它不是一个真正的东西。 “SQL sn-p”更合适,因为它指的是文件中的一些SQL语句,仅此而已,并暗示它们需要另一个工具才能做某事。相比之下,脚本是可以直接执行的。如果没有正确连接在一起的客户端服务器,它们就无法执行。任何可以连接到您的服务器并提供 SQL 命令的东西都被视为客户端。这包括各种编程语言中使用的 Postgres 驱动程序。 do-sql 只是您可能编写的包装脚本的一个示例。它将由psql -u myname ... 之类的内容和许多其他选项组成,以确保它正确连接到正确的主机等。 谢谢。我发现psql -f 似乎是接受 sql 脚本文件的那个。不过不确定mysql。干杯。之前犯了一个错误,bash -c 用于接受 bash 命令作为内联脚本,即命令行参数

以上是关于sql 脚本是仅由 PostgreSQL 服务器接受,还是由服务器和客户端 psql 接受?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 PostgreSQL 中运行临时脚本?

怎么把sql文件导入postgresql数据库

sql脚本函数编写postgresql数据库

从 Django 创建 SQL 插入脚本以填充 PostgreSQL 数据库

Wix,PostgreSQL 安装,执行 Postgresql 脚本

Robot Framework - 使用 PostgreSQL 从数据库中执行 Sql 脚本关键字