在C语言中编写数据库抽象层的好策略

use*_*893 2 c api postgresql rdbms libpq

我需要在C中为PostgreSQL(libpq)的数据库访问API 以及可能的其他一些关系数据库管理系统编写一个数据库抽象层.

我正在考虑在pqsql和其他数据库系统中编写自己的现有函数抽象.编写这样的数据库抽象API时,最好的策略是什么?

到目前为止,我首选的写作计划可能是:

  1. 为任何感兴趣的特定数据库系统定义头,函数和包装器.
  2. 使用第一个连接调用(函数)时,检查并确定适合的关系数据库管理系统.
  3. 包括数据库抽象的正确方法和定义集.

但这种处理方式可能允许一次使用一个关系数据库管理系统.这对于数据库抽象层来说是常见的吗?

还有什么其他选择可以考虑?

Cra*_*ger 10

不要重新发明这个轮子.

它已经反复完成,虽然最受欢迎的系统(ODBC)无疑是丑陋的,但它已经为你听过的每个数据库编写了抽象.使用UnixODBC项目,它也存在于UNIX和POSIX UNIX上,就像Mac OS X一样.

libdbi是一种稍微不那么丑陋的替代方案,具有更窄的数据库支持.你不会像libdbi那样从libdbi的供应商处获得驱动程序.

怎么反复?

如果C++没问题,我听到非常好的另一个数据库抽象层是诺基亚(曾经是TrollTech)提供的Qt框架的 数据库接口.它具有已经*编写*和测试的主要优点.主要的缺点是,如果您的应用核心不是基于C++和Qt,那么它有点笨拙.

其他C++选项,我个人没有使用过,是sqlapi ++,dtemplatelibSOCI.

如果到目前为止你想知道为什么在C++中为所有这些数据库抽象层编写,也许这是一个暗示.如果你用C编写一个DB抽象层,我打赌你会通过函数指针的结构重新发明C++虚方法,并且可能最终创建一些像GObject一样难看的东西,在这种情况下你也可以使用libgdb/gnome -db.为了避免假的虚拟方法垃圾,你可以通过运行时库路径在链接时选择数据库层,只提供一堆普通的老函数,但我不知道为什么你这么做的时候会这么做选项在附近.

顺便说一句,如果事实证明你根本不需要DB抽象,只有一个更好的界面(因为你主要针对Pg),请查看libpqtypes(普通C,没有C++,非常便携),也称为"什么" libpq应该是".即使您要添加抽象层,也可能值得在libpqtypes上进行,而不仅仅是libpq.

如果ODBC,libdbi,libpqtypes,Qt等不适合您,则需要定义原因,并创建一组更具体的标准来满足.

或者:如果您的设计允许,您可能需要考虑使用Python(psycopg),Ruby,PerlJava(JDBC)等数据库抽象层以嵌入式更高级语言进行数据库访问和相关工作.所有这些都有自己广泛采用且经过良好测试的数据库抽象层,您可以从中受益,同时仍然在C中编写大部分程序.或者,就此而言,您可以在C中编写程序的性能关键位作为库,并使用已经为您编写的理智的数据库抽象层,从您选择的语言中使用它.

数据库抽象很难.真的很难.数据库抽象使用起来并不太糟糕,表现得体面,并且足够灵活,可以使用数据库,因为不仅仅是愚蠢的行存储更难 - 迟早,你需要的不仅仅是一个笨拙的行存储.