PostgreSQL语法高亮

我赶紧分享一个好消息:有关PostgreSQL的文章的作者及其读者的生活变得更好了。

众所周知,所有habispister都设计了一个特殊的<source>标签来设计源代码,该标签突出了语法。 背光并非总是完美的,这已经不是什么秘密,然后作者(关心文章的外观)被迫从事业余表演-使用<font color=...>代码<font color=...>

对于PostgreSQL来说,一切都特别令人难过,因为突出显示的内容或多或少涵盖了标准SQL,并且绝对不了解DBMS的细节。 随着时间的流逝 ,Alexey boomburum仔细地纠正了我的字体来作为源文件(然后我又回来了),直到很明显需要固定背光灯为止。 最后,Daler daleraliyorov提出了一条出路:将PostgreSQL支持添加到Habr使用的highlightjs库中。 现在-完成,欢迎您。

pgsql:SQL,PL / pgSQL和所有所有


因此,正确突出显示的秘密在于新的pgsql语言。 可以在菜单(按钮“源代码”)中选择它,也可以手动指定它。 在html中,您需要编写

<source lang="pgsql">

</source>

并在降价中是这样的:

```pgsql

```

原则上,highlightjs可以确定语言本身,但通常它仅适用于大型代码片段。 在小的情况下,自动检测通常会丢失。 此外,自动检测还需要时间,因此,如果您明确指定语言,则代码将更快地闪烁。

例如,获得

 CREATE TABLE aircrafts_data ( aircraft_code character(3) NOT NULL, model jsonb NOT NULL, range integer NOT NULL, CONSTRAINT aircrafts_range_check CHECK ((range > 0)) ); 

我们正在写

<source lang="pgsql">
CREATE TABLE aircrafts_data (
aircraft_code character(3) NOT NULL,
model jsonb NOT NULL,
range integer NOT NULL,
CONSTRAINT aircrafts_range_check CHECK ((range > 0))
);
</source>

相同的pgsql语言也为PL / pgSQL代码着色。 例如,获得

 CREATE FUNCTION get_available_flightid(date) RETURNS SETOF integer AS $$ BEGIN RETURN QUERY SELECT flightid FROM flight WHERE flightdate >= $1 AND flightdate < ($1 + 1); IF NOT FOUND THEN RAISE EXCEPTION '   : %.', $1; END IF; RETURN; END $$ LANGUAGE plpgsql; 



<source lang="pgsql">
CREATE FUNCTION get_available_flightid(date) RETURNS SETOF integer AS $$
...
$$ LANGUAGE plpgsql;
</source>

有点细微之处是,用美元括起来的字符串始终以代码突出显示,而撇号中的字符串则始终不突出显示。 我考虑了不同的选择,但这似乎是最合适的。

highlightjs具有自动检测片段语言的功能,从而可以用其他语言突出显示功能。 例如,一切都适用于PL / Perl:

 CREATE FUNCTION perl_max (integer, integer) RETURNS integer AS $$ my ($x, $y) = @_; if (not defined $x) { return undef if not defined $y; return $y; } return $x if not defined $y; return $x if $x > $y; return $y; $$ LANGUAGE plperl; 

您不需要任何特别的东西,只需写

<source lang="pgsql">
CREATE FUNCTION perl_max (integer, integer) RETURNS integer AS $$
...
$$ LANGUAGE plperl;
</source>

当然,选择的语言仅取决于美元内写的内容,而绝不取决于语言之后的写法。

通常,背光与最近发布的PostgreSQL的第11版相对应。

对于突出显示功能存在很多疑问。 不幸的是,为了将函数名称与例如表名称区分开来,需要完整的解析,但这在语法高亮显示中无法解决。 您可以列出一长串标准函数并为其着色,但是来自众多扩展的函数呢? 结果,我决定完全不上色-一样,所有内容都取决于关键字,并且减少了杂色。

纯文本:文本,纯文本


有时在文章中需要形式化查询结果。 当然,这里没有关键字,也不需要突出显示任何内容,但是我希望文本看起来像代码一样“控制台”。 为此,您现在可以使用特殊的纯文本语言。 例如,获得

 WITH xmldata(data) AS (VALUES ($$ <example xmlns="http://example.com/myns" xmlns:B="http://example.com/b"> <item foo="1" B:bar="2"/> <item foo="3" B:bar="4"/> <item foo="4" B:bar="5"/> </example>$$::xml) ) SELECT xmltable.* FROM XMLTABLE(XMLNAMESPACES('http://example.com/myns' AS x, 'http://example.com/b' AS "B"), '/x:example/x:item' PASSING (SELECT data FROM xmldata) COLUMNS foo int PATH '@foo', bar int PATH '@B:bar'); 

  foo | bar -----+----- 1 | 2 3 | 4 4 | 5 (3 rows) 



<source lang="pgsql">
WITH xmldata(data) AS (VALUES ($$
...
</source>
<source lang="plaintext">
foo | bar
-----+-----
1 | 2
3 | 4
4 | 5
(3 rows)
</source>

纯文本应始终明确指定;不会自动检测到。

希望您喜欢创新并派上用场。 如果您发现代码的突出显示方式有错误(并且错误是不可避免的,则上下文敏感的语法对于SQL来说太多了),请在项目的github上创建一个任务,甚至更好地提出解决方案。

PS:别忘了将于2月4日至6日在莫斯科举行的PGConf会议。 报告申请截止至12月5日!

Source: https://habr.com/ru/post/zh-CN430040/


All Articles