Is a sql script acceptable solely by PostgreSQL server, or by both server and client psql?
SQL脚本是否只能由RDBMS(如PostgreSQL服务器)或服务器和客户机(如PSQL)解释?服务器可以接受SQL脚本文件,还是只有客户端可以接受?
我的问题来自于在psql中,\i可以用于读取和执行SQL脚本。但是,如果PostgreSQL服务器可以接受SQL脚本,那么如何向服务器提供该脚本呢?
在编写SQL脚本时,如何编写注释?#是否仍用于发出评论信号?
我需要提供shebang吗?如果是的话,有舍邦比没有好吗?
谢谢。
我正在尝试将https://stackoverflow.com/a/771880/156458放入SQL脚本中,以便重用它。
- SQL中的注释是/* */或--(多行和单行)
- 简单地说:SQL客户机(psql将文件读取到内存中并将其发送到服务器,就好像键入了文件一样。并且#在SQL中不是有效的注释字符。而"shebang"是特定于UNIX(或Linux)shell的东西,与SQL脚本无关。
- @psql会将SQL脚本的内容传递给服务器而不修改它吗?
- 你可以这样想象,是的
- @服务器可以接受一个SQL脚本文件,还是只有客户端可以接受?
- Postgres有一本很棒的手册,可以回答很多语法问题。
- @塔德曼谢谢。我正在读,但对术语还不够熟悉,有时找不到有用的信息
像许多SQL shell一样,psql对postgres语法有基本的理解。这允许它标识语句的结尾,并将其转发给服务器以供执行。许多客户机还需要了解语法的其他原因,例如语法突出显示。
默认语句终止符是;,可以出现在字符串中。这意味着需要一个基本的解析器来避免发送不完整的语句。此终止符也可以更改,因此客户端需要跟踪当前的终止符或"分隔符"是什么。
实际上没有一个独立的SQL脚本可以像脚本语言那样直接执行。您应该有一个最小的包装器,它可以帮助正确连接到服务器、进行身份验证,然后通过使用重定向(如do-sql < test.sql或\i导入工具等功能在SQL中发送负载。
- 谢谢。所以SQL脚本只能被客户机接受,而不能被服务器接受?
- do-sql是否是psql的客户替代品?
- "SQL脚本"是一个不应该使用的术语,因为它实际上不是一回事。"sql snippet"更合适,因为它指的是一个文件中的一些sql语句,而不是更多,它意味着它们需要另一个工具来做一些事情。相比之下,脚本是可以直接执行的。如果没有一个客户机和一个正确连接在一起的服务器,就不能执行它们。任何可以连接到服务器并提供SQL命令的东西都被视为客户机。这包括在各种编程语言中使用的Postgres驱动程序。
- do-sql只是您可能编写的包装脚本的一个示例。它将由类似于psql -u myname ...的东西和一系列其他选项组成,以确保它正确地连接到正确的主机,等等。
- 再次感谢。(1)SQL命令的终止符(无论是新行还是其他行)是否只能由客户机理解,而不能由服务器理解?所以必须向客户机而不是服务器提供一个SQL代码段文件?(2)psql是否只接受来自stdin的SQL命令,而不接受来自SQL片段文件的SQL命令?在这方面,mysql的行为是否与psql的行为相同?
- 通常,但并非总是如此,客户机将使用分隔符标识语句,并使用适当的二进制协议将这些语句转发给服务器。理论上,客户机可以使用它想要的任何分隔符,换行符或其他,但是约定认为它通常是;,并且可以根据需要进行更改。因为多行语句很常见,所以很少换行。
- 由于服务器只使用posgres协议,而不使用原始SQL,因此需要使用某种类型的客户机。psql是随服务器提供的,但还有许多其他的。它们的功能不同,但大多数都可以处理粘贴或从文件加载的输入。在这两种情况下,它都只是文本。
- (2)我的意思是,当调用bash时,可以使用bash -c在命令行指定shell脚本,而psql是否有这样的功能(选项),或者只通过其元命令\i接受stdin中的脚本?
- 如果你对psql的功能很好奇的话,它是完全文档化的。
- 是的,我已经搜索过了,虽然不是每一个字都读过。当从shell调用psql时,我没有找到一个选项让psql接受SQL脚本文件。
- 它像任何命令行程序一样接受输入。psql ... < my.sql,其中my.sql是您的SQL文件。这个文件也可以由一系列\i otherfile.sql指令组成。
- 谢谢。重定向是另一种方式。仍然接受来自stdin的输入。shell将stdin重定向到my.sql。但与bash -c不同。
- "由于服务器只使用posgres协议,而不使用原始SQL,因此需要使用某种类型的客户端。"例如,SQL和pl/pgsql都是服务器端语言,"服务器端"是否意味着服务器可以直接接受和理解它们?或者您的评论是否意味着它们不在posgres协议中,所以服务器无法理解SQL和pl/pgsql命令?客户端psql的任务是将SQL和pl/pgsql命令转换成posgres协议中的消息,然后将该消息发送到服务器吗?
- 如果您阅读了Postgres协议(如果与SQL命令集相关,则该协议本身是独立的),它只定义了如何通过连接传输命令、数据和结果集。客户机对SQL有一个基本的了解,刚好可以通过,而服务器有一个完整的了解,以便实际做一些有用的事情。客户机使用协议"框架"命令并解释响应。
- 这与HTML和HTTP的关联方式并无不同,但也有所不同。
- 谢谢。我发现psql -f似乎是接受SQL脚本文件的。不过,对mysql不太确定。干杯。之前犯了一个错误,bash -c是接受bash命令作为内联脚本,即命令行参数。