【问题标题】:release postgresql extension发布 postgresql 扩展
【发布时间】:2017-05-06 05:22:47
【问题描述】:

我正在开发在 postgres 中保存数据的应用程序。所以我必须在使用应用程序之前准备数据库,必须创建几个表。我正在通过运行 sql 代码创建这些表,但我认为找到这个文档后不方便:

一个有用的 PostgreSQL 扩展通常包括多个 SQL 物体;例如,一个新的数据类型将需要新的函数,新的 运算符,可能还有新的索引运算符类。这有助于 将所有这些对象收集到一个包中以简化数据库 管理

使用扩展的主要优势,而不是仅仅运行 将一堆“松散”对象加载到数据库中的 SQL 脚本是 然后 PostgreSQL 将理解扩展的对象 一起去

我相信我必须使用这种方法

我不明白如何分享我的扩展程序。我认为它像 maven 一样工作,您可以使用自定义类型、函数、表创建扩展,然后您可以打包、命名它(​​例如 my-ext-0.1)、提供版本并发布到某种存储库中。之后,您可以连接到数据库,运行 sql 'create extension my-ext-0.1' 并完成所有操作 :)

我认为“创建扩展”命令将下载扩展并安装它,而无需手动下载。我使用 maven、ivy 并且我期望 postgresql 有类似的行为。

文档说您需要将扩展​​文件放在某个目录下,并且只在某个数据库下运行“创建扩展”。

您如何创建扩展程序并在不同服务器之间共享它们?

【问题讨论】:

标签: sql postgresql postgresql-extensions


【解决方案1】:

Postgres 扩展不能这样工作。他们可以访问数据库内部,并且可以作为数据库操作系统用户运行任何代码。因此,安装它们通常仅限于超级用户,来自特定目录,并且只有其中一些在托管托管服务器上可用。

尽管您可以通过在添加到搜索路径的特殊模式中安装补充函数、类型和表来实现类似的效果。升级就很简单了:

drop schema mylib cascade; -- don't do this!!!
create schema mylib;
\i mylib.sql

但不幸的是,这也会从其他模式中删除所有依赖对象 - 使用自定义类型的列,使用自定义函数的触发器等。所以它不是解决您问题的方法。

【讨论】:

  • 创建脚本,单独的架构,修改搜索路径似乎是一个非常明智的方法。涉及表或数据的升级需要特定版本的升级脚本才能保留数据。
【解决方案2】:

我宁愿使用可用的扩展和“标准”语言在我的架构中创建我的函数、类型和所有内容。

Postgres 不会下载您的扩展程序(除非您创建的扩展程序会将此功能添加到 postgres)。但是您的扩展程序仍应以“通常”的方式创建。

要检查您的“扩展目录”,请运行:

t=# create extension "where should I put control file";
ERROR:  could not open extension control file "/usr/local/share/postgresql/extension/where should I put control file.control": No such file or directory

并重复评论,在extending SQL 之前,请查看plpgsql 和现有命令。

当您感到无聊并确保现有的 postgres 功能过于有限时,请安装 postgres-contrib 包并检查其他扩展作为最佳实践。当然也可以查看https://pgxn.org/

【讨论】:

    猜你喜欢
    • 2022-07-15
    • 2013-01-18
    • 1970-01-01
    • 1970-01-01
    • 2023-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-13
    相关资源
    最近更新 更多