如何防止PostgreSQL更改格式良好的SQL定义

如何防止PostgreSQL更改格式良好的SQL定义,sql,postgresql,Sql,Postgresql,我注意到,在为PostgreSQL编写SQL之后,当我稍后查看SQL定义时,数据库似乎改变了我格式化SQL的方式。例如,我的前导逗号被移到后面,我的制表符被改变,等等 有没有办法防止这种情况发生?唯一的办法是将源代码存储在版本控制系统中。PostgreSQL仍然会做它所做的事情,但它不能改变VCS中的代码 然而,这并不是大多数人处理数据库的方式,需要一些自律才能使所有的鸭子保持一致。这是一个误解。Postgres不会“改变格式”。原始SQL字符串根本不存储 对查询进行解析和重写,并根据查询的类型

我注意到,在为PostgreSQL编写SQL之后,当我稍后查看SQL定义时,数据库似乎改变了我格式化SQL的方式。例如,我的前导逗号被移到后面,我的制表符被改变,等等


有没有办法防止这种情况发生?

唯一的办法是将源代码存储在版本控制系统中。PostgreSQL仍然会做它所做的事情,但它不能改变VCS中的代码


然而,这并不是大多数人处理数据库的方式,需要一些自律才能使所有的鸭子保持一致。

这是一个误解。Postgres不会“改变格式”。原始SQL字符串根本不存储

对查询进行解析和重写,并根据查询的类型采取操作例如,当您创建视图时,结果存储在系统目录中,大部分是和

您还必须知道,所有标识符都是在创建数据库对象时解析的,并考虑了当前和可见性(早期绑定)。如果环境以任何方式发生变化,相同的查询字符串以后可能会有不同的含义

您稍后看到的是根据这些条目重新设计的版本。 这方面有一些帮助,但主要取决于客户机如何格式化反向工程SQL代码

是个例外(部分例外)。函数体以字符串形式传递,并按原样保存,与传递的完全相同,(当前)仅对对象进行表面语法测试和验证。例如,如果您想在Postgres中快速“保存”包含其格式的查询,可以使用PL/pgSQL函数


通常的方法是拥有一个独立的代码库,比如-或者不太关心格式。

您是指表定义和函数定义吗?在这种情况下:恐怕你无法阻止重新格式化。嗨,wildplasser。我指的是函数和视图的SQL定义。在编辑器中查看代码时,格式与我编写的格式不同。逗号移动了,缩进有点不同,等等。嗨,迈克。我是否可以将代码保存在单独的文件中,编辑这些文件,然后将更改提交回数据库?这样看来,我可以保留我的格式,而不必担心IDE在事后如何显示它。这是常见的吗?非常感谢,您可以将代码保存在单独的文件中。例如,我将
createtable
createindex
语句保存在单独的文件中,以防需要从灾难中恢复。数据加载速度更快,无需索引;makefile可以按您喜欢的任何方式将各个部分组合在一起。我不确定我是否知道你所说的“将更改提交回数据库”是什么意思。“将更改提交回数据库”实际上只是指将文件中的DDL代码的任何更改应用回数据库。根据我的经验,最好先提交版本控制,然后再将更改应用到数据库。有两种人。(咳嗽)问一个问题,“数据库的最新更改在哪里?”一种人指着版本控制系统。另一类指向“dev”数据库。(那些人可能使用Redgate软件来管理更改。)谢谢你,欧文,这真的澄清了问题。你可能知道,我对PostgreSQL有点陌生。您认为大多数开发人员都使用独立的代码库吗?这很常见吗?@JordanRovny:单独的存储库很常见,尤其是在大型项目中,不仅仅是有时间线和快照等。我也有很多项目,我只是在“事后”将备份作为代码存储库。你在备份中得到的格式基本上是合理的——比大多数人类作者提供的格式要好。有时,代码只能与数据的当前状态协同工作。这要看情况了,很有趣。你能解释一下“备份中的格式”吗?我不太明白。非常感谢,@JordanRovny:当您用文本格式备份数据库时(仅使用架构或架构和数据),您会得到一整套SQL命令-以某种格式。@JordanRovny Erwin在这里列出的是一个bug和一个功能。早期绑定对性能很有好处;但是,如果您期望不同的行为,它可能会导致问题。例如,与早期绑定不同,我希望创建一个视图,该视图将使用搜索路径来获得优先级/支配地位。如果我在多个模式中有相同的表名(称之为test和production),我可以在这两个模式中使用相同的视图(
select*from public.v_foo
),但早期绑定会阻止这种情况发生,因为它会将视图中的表解析为特定模式。。。