【发布时间】:2018-02-16 04:51:10
【问题描述】:
我的 go 应用应该支持多个数据库。这意味着,在不同的数据库上运行相同的二进制文件,应用程序正在使用的数据库将由配置决定。
问题是,每个数据库都有自己的预处理语句语法。 示例:
db.Prepare("select p, f, t from mytable where p = $1")
适用于 postgres,但不适用于 mysql。
db.Prepare("select p, f, t from mytable where p = ?")
适用于 mysql 但不适用于 postgres。
关闭诅咒我可以通过在运行时编辑字符串或维护多个查询来解决它。
有没有更好的办法?
我不想使用一个可以控制我所有数据库访问的外部库进行一些巨大的抽象,但是如果有一些轻量级的库可以神奇地修复语法,那我很满意。
编辑: 总结一下我之前说过的话,困扰我的部分是对于 mysql 你将不得不使用“?”而对于 postgres,您将不得不使用 $1, $2...
干杯
【问题讨论】:
-
您可以使用 lib 编写流畅的 SQL,例如 github.com/Masterminds/squirrel
-
你所说的“一些巨大的抽象”是什么意思?你反对使用 ORM 吗?因为听起来 ORM 正是您所需要的。如果您不反对使用 ORM,那么 GORM 就是您的朋友 - jinzhu.me/gorm
-
我现在只有一个表,并且可能只有几个必须非常高效的查询。他们必须使用多个数据库。我并不反对或支持 ORM,只是对于我的用例,我认为它不合适。
-
如果您的用例要求您支持不同的 SQL 方言并拥有一个接口,那么 ORM 就可以满足您的用例。是的,肯定是一张桌子,如果成功可能会变成两三张。不要就什么是对什么是错做出决定,认为成功和不成功。我知道仅仅为了一个小问题而扔掉整个库是过分的,但在某些情况下,我们希望专注于交付与技术正确性。
-
使用接口。根据设置定义通用接口并在运行时设置特定的实现。
标签: mysql sql postgresql go prepared-statement