试图选择SQL API库

时间:2009-09-21 23:00:13

标签: c++ sql api odbc

我刚刚开始学习如何编写访问SQL服务器的软件。看起来每个服务器实现(Postgres,MySQL等)都提供了各种语言的API库(我的代码是C和C ++,尽管Java和Python的解决方案也让我感兴趣)。但是,我对依赖这些库有点警惕,因为我更喜欢与供应商无关的解决方案。

尽管我可以说,微软的ODBC API旨在解决C / C ++(以及JDBC for Java)的问题; unixODBC似乎是一个流行的实现。到目前为止我是对的吗?

此外,任何此类库是否提供面向对象的接口?不要简单地将SQL查询嵌入到另一种更有用的语言中,这将是一件好事。我想要一个能够模仿其他语言风格的包装器。

那么这些线路是否有首选解决方案?我要求一些奇怪的东西吗?

5 个答案:

答案 0 :(得分:1)

  

尽管我可以说,微软的ODBC API旨在解决C / C ++(以及JDBC for Java)的问题; unixODBC似乎是一个流行的实现。到目前为止我是对的吗?

是。用于Python的ODBC或JDBC的等价物称为DB-API。 Perl的等价物称为DBI。

  

此外,任何此类库是否提供面向对象的接口?不要简单地将SQL查询嵌入到另一种更有用的语言中,这将是一件好事。我想要一个能够模仿其他语言风格的包装器。

是的,对于不同的语言,有很多这样的事情。 C#有LINQ,Smalltalk有Roe和GLORP,Python有SQLAlchemySQLObject(Python中的Django有很多query power built into its ORM(见{{ 3}})),Ruby有ActiveRecord,等等。我不知道你在C ++中使用了什么,但我敢打赌它必须使用大量丑陋的模板黑客才能接近这些。

所有这些选择看起来似乎都是压倒性的,但是你选择的语言很可能会被除了处理关系数据的便利之外的东西所塑造。 (如果没有,你应该考虑Prolog。)这可能会或多或少地与你讨厌的ORM联系起来,就像我们其他人一样。

答案 1 :(得分:0)

ODBC / JDBC尝试抽象出数据库接口,以提供一致的编程模型。请记住,通过使用这种最小公分母界面,您无法利用给定数据库可能提供的特定非标准功能。

要获得数据模型的面向对象接口,请查看对象关系映射(ORM)解决方案,例如Hibernate。 ORM解决方案将您的对象映射到关系数据库中的表示,通常从应用程序编程的角度来看,数据持久性更加简单。

答案 2 :(得分:0)

实际上,ODBC / JDBC是有助于在供应商之间建立调用接口标准的库,但你是对的,每个相应的RDBMS都有自己的SQL风格。 ODBC / JDBC无法帮助抽象SQL语法。

将文字SQL移出应用程序代码的一种解决方案是在驻留在每个数据库后端的存储过程中实现查询,然后使用ODBC / JDBC来调用存储过程。您可以为您使用的每种RDBMS定义具有相似名称和调用接口的存储过程。但请注意,存储过程语言也可以从一个供应商变为另一个供应商。

另一种解决方案是使用“对象 - 关系映射”技术,例如Hibernate for Java或NHibernate for .NET。这些技术可以让它感觉更像“面向对象”来处理数据库,并且在许多情况下使您无需编写文字SQL。

但是大多数ORM工具都倾向于关注非常简单的查询。如果您的查询完全复杂(例如使用GROUP BYJOIN),则使用ORM工具更难而不是使用文字SQL。

另请参阅“Good ORM for C++ solutions?

如果SQL麻烦你那么多,你可能根本不会对使用RDBMS感到满意。例如,一些程序员没有看到规范化规则的价值。如果这对您而言,您可能希望研究非关系数据存储的新兴技术,包括:

答案 3 :(得分:0)

Quince是一个C ++库,它允许您将C ++语法和C ++类型与SQL的功能集一起使用。目前它仅支持PostgreSQL和sqlite,但总是可以添加新的后端。请参阅quince-lib.com。 (完全披露:我写了。)

答案 4 :(得分:0)

看看Qt。它不是一个库,而是一个完整的框架。它有一个非常出色的SQL模块。

  

Qt SQL是提供对SQL支持的基本模块   数据库。 Qt SQL的API分为不同的层:

if ((df.Item == df.Item) and
        (df.Date > df.Date) and (df.Count > df.Count)):
    print("we met the conditions!")

http://doc.qt.io/qt-5/qtsql-index.html