从一个开箱即用的应用程序连接PostgreSQL的方便方法? (嵌入PostgreSQL)

时间:2014-01-04 18:34:40

标签: c++ qt postgresql

我正在尝试在我的应用程序中使用PostgreSQL来管理一些记录。 使用SQLite,不需要复杂,因为它是一个文件db。

但是,对于PostgreSQL,即使我想连接localhost或本地套接字文件,也应该在使用它之前完成一些设置。 当然,初始化只需要一次,但问题是,我不想打扰我的应用程序使用此系统设置问题。 我希望用户能够运行并使用我的应用程序开箱即用状态。

我已经阅读了一篇wiki文章,在Arch Linux(https://wiki.archlinux.org/index.php/PostgreSQL)中使用PostgreSQL,没有人愿意使用我的应用程序来做这些事情。 此外,无法从应用程序在wiki中运行这些命令,因为具体设置取决于发行版并且还需要root权限。

有没有办法在没有像SQLite这样复杂的初始化的情况下连接PostgreSQL?或者,简单的方法来准备用户的系统?

仅为了您的信息,我的应用程序是用C ++和Qt编写的。 并且,我不能使用SQLite来限制它。

2 个答案:

答案 0 :(得分:2)

如果你想要一个嵌入式数据库,PostgreSQL不是一个很好的选择。它可以使用,但与设计用于嵌入Firebird,SQLite等的DB相比,它有点笨拙。

捆绑PostgreSQL

如果您想使用PostgreSQL,我建议将PostgreSQL二进制文件与程序捆绑在一起,并在使用程序时启动PostgreSQL服务器 - 假设您一次只需要一个程序实例。您可以获得方便的预建Pg二进制文件from EDB。您可以在启动时为用户提供选择 - “使用现有的PostgreSQL”(在这种情况下,他们必须自己创建用户和数据库,进行任何pg_hba.conf更改等)或“启动私有PostgreSQL服务器”(当您运行自己的服务器时)使用捆绑的二进制文件。)

如果他们想使用现有数据库,您只需告诉他们输入host / socket_directory,数据库名称,端口,用户名和密码。不要求“密码”,如果他们的hba配置不需要密码,它可能是空白的。

如果他们想要使用私人实例,你可以启动它 - 请参阅下面的指导。

捆绑PostgreSQL 安装程序并将其作为静默安装运行。这对于穷人用户来说是一场噩梦,他不知道这个“postgresql”东西来自哪里,很可能会将其卸载。或者更糟糕的是,它会与他们自己的PostgreSQL安装冲突,或者在他们以后自己安装PostgreSQL时发现他们已经拥有它并且甚至不知道密码时会混淆它们。是啊。不要那样做。仅捆绑二进制文件并自行控制您的私有PostgreSQL安装。

不要只使用系统上已有的postgres个可执行文件来创建自己的私有实例。如果用户决定从9.2升级到9.3,则突然您的私有实例将无法启动,并且您将无法访问旧的9.2二进制文件来执行pg_upgrade。如果您正在使用Pg的私有实例并将程序中所需的二进制文件捆绑在一起,则需要承担全部责任。

如何启动/控制Pg的私有实例

首次运行时,运行PostgreSQL的initdb -D /path/to/datadir,指向程序的私有数据目录的空子目录。首先设置一些环境变量,这样就不会与系统上的任何普通PostgreSQL安装冲突。特别是,将PGPORT设置为某个随机高端口,并为默认值指定不同的unix_socket_directory配置参数。

运行initdb后,您的程序可能希望修改postgresql.confpg_hba.conf以满足其需求。我个人不打扰,我只是在PostgreSQL服务器启动命令行中传递我想要的任何参数,包括覆盖hba_file指向我预先创建的一个。

如果在程序启动期间数据目录已存在,则需要通过检查PG_VERSION文件来检查datadir是否与当前的PostgreSQL主要版本匹配。如果没有,则需要复制datadir并运行pg_upgrade将其升级到捆绑的当前版本。您需要保留旧版本的二进制文件的副本,因此您需要特殊情况下更新过程,或者只是在更新安装程序中捆绑旧版本的二进制文件以及新版本。

当你的程序启动时,在检查datadir已经存在并且版本正确后,将PGPORT env var设置为与initdb相同的值,然后直接使用{启动PostgreSQL {1}}以及日志文件输出等的合适参数。您启动的postmaster将程序作为父可执行文件,如果程序突然退出,将终止。没关系,它将有时间进行清理,即使它不是PostgreSQL也是设计崩溃安全的。不过,您的计划仍应politely ask PostgreSQL to shut down before exiting by sending an appropriate signal

您的应用程序现在可以连接到它拥有的PostgreSQL实例,并使用libpq或其他任何方式控制,通常情况下,通过指定正在运行它的端口和(如果进行unix套接字连接)将postgres -D /path/to/datadir传递为host

您可以改为使用/path/to/whatever/unix/socket/dir来驱动它,而不是直接控制postgres。这样,您可以在程序退出时让数据库保持运行,只有在您发现它尚未运行时才启动它。如果用户在没有关闭PostgreSQL的情况下关闭系统并不重要 - Pg通常会从操作系统获得一些关闭警告,但是不需要它或关心它,它很高兴只是崩溃和恢复下次启动的时候。

答案 1 :(得分:1)

这绝对不像使用SQLite那么容易。 在SQLite中,您只有一个包含整个数据库的文件,如果您“连接”到数据库,则只需打开该文件即可。 在PostgreSQL,MySQL,...你有一个数据库守护进程,它可以保持大量文件打开,你有多个文件用于数据库本身,然后是事务日志,日志文件..当然还有配置文件,它们指定了所有这些文件的位置,资源使用,如何连接等等。并且还需要定期维护数据库以获得最佳性能,并且有许多可调参数。这都是因为所有这些数据库的通常使用是尽可能快地为多个客户端提供服务而不是简化设置。

仍然可以为单个用户设置PostgreSQL。要设置数据库,您需要创建一个数据库目录,在localhost上查找未使用的端口以进行TCP连接或更好地使用UNIX域套接字,使用所需参数编写配置(如使用的套接字,数据库目录,用户,资源限制,权限)这样,同一台机器上的其他用户都无法连接),启动数据库守护程序,初始化数据库(postgresql可以在同一个守护程序设置中提供多个数据库),最后从程序连接到数据库。并且不要忘记定期运行维护任务并以有序的方式关闭数据库。