SQL 是为人类编写的接口,但数据库首先要对其进行解析,并将其转换为具体的实现,然后才能使用查询。我很震惊地得知 PostgreSQL 没有“机器”API。libpq 将查询作为字符串!因此,当sqlkorma或s-sql将他们的 DSL 转换为字符串时,这不是一个 hacky 解决方案,因为这是 libpq 所期望的。是否有任何努力对不将字符串 SQL 语句作为输入的 API 进行标准化?类似的东西select(list_of_fields, table)
2 回答
你看过ECPG吗?
嵌入式 SQL 程序由以普通编程语言(在本例中为 C)编写的代码以及特殊标记部分中的 SQL 命令混合而成。
*.pgc
为了构建程序*.c
,源代码((有关编译和链接的详细信息,请参见第 33.10 节)。转换后的 ECPG 应用程序通过嵌入式 SQL 库(ecpglib)调用 libpq 库中的函数,并使用普通的前后端协议与 PostgreSQL 服务器通信。嵌入式 SQL 在处理来自 C 代码的 SQL 命令方面优于其他方法。首先,它负责在 C 程序中与变量之间进行繁琐的信息传递。其次,在构建时检查程序中的 SQL 代码的语法正确性。第三,在 SQL 标准中指定了 C 中的嵌入式 SQL,并得到许多其他 SQL 数据库系统的支持。PostgreSQL 实现被设计为尽可能地匹配这个标准,并且通常可以相对容易地将为其他 SQL 数据库编写的嵌入式 SQL 程序移植到 PostgreSQL。
如前所述,为嵌入式 SQL 接口编写的程序是普通的 C 程序,其中插入了特殊代码以执行与数据库相关的操作。此特殊代码始终具有以下形式:
EXEC SQL ...;
这些语句在语法上代替了 C 语句。根据特定的语句,它们可以出现在全局级别或函数内。嵌入式 SQL 语句遵循普通 SQL 代码的区分大小写规则,而不是 C 代码。
以下部分解释了所有嵌入式 SQL 语句。
我真的很想知道为什么你认为你需要这个。在准备好的语句和 Postgres 查询解析器的性能之间几乎没有什么优化。对于任何重要的查询,查询的执行都将比解析慢数百倍。
大多数 RDBMS 都有一种过程语言,允许对以下 API 进行规范:
create_customer(customer_name, customer_address, customer_phone_number);
get_customer_id(customer_name);
generate_invoice(order_id);
PostgreSQL 有 PL/pgSQL(和其他),Oracle 有 PL/SQL(和 Java)等,所以虽然服务器端的语言可能不同,但理论上你可以在多个 RDBMS 中开发完全相同的系统并在其中创建 API每个都有几乎相同的界面。
如果您想避免在应用程序中生成 SQL 字符串,请使用适当的 RDBMS 过程语言为您的数据库编写一个 API,然后使用它。
编辑:当然还有一些抽象,比如 ActiveRecord,它也会为你翻译成 SQL。