2014-02-11 80 views
0

我最近实现了a package,它使用了database/sql包。通过将SQL限制为非常简单的select/update/insert语句,我假定该软件包可以与database/sql支持的所有DBMS一起使用。使用database/sql包创建通用代码?

然而,事实证明,某些数据库使用?作为暂定值,而其他人使用$1$2等,这意味着准备的语句会与某些DBMS但不与他人合作。

所以我想知道是否有任何技术使所有支持的驱动程序以通用的方式进行工作?还是有必要在每个地方都有DBMS特定的代码? (我认为这将使database/sql提供的抽象有点没有意义)。我猜想使用非预处理语句不是一种选择,因为不同的DBMS有不同的方式来转义参数。

有什么建议吗?

+2

https://github.com/jmoiron/sqlx是数据库/ sql之上的一项功能,可以处理1美元vs?我建议看看源代码。 – elithrar

回答

1

我认为这种行为被遗漏了,因为SQL方言在数据库之间差别很大,Go团队希望避免为每个驱动程序编写一个预处理器来将'GoSQL'转换为本地SQL。数据库/ sql包通常提供连接争夺,这是一种属于'非常必要'的抽象,而不是语句翻译,这是'非常好'。

这就是说,我同意重写每一个陈述是一个主要的麻烦。不过,使用正则表达式替换标准占位符与原生数据库的方式来包装数据库/ sql/driver.Prepare()方法应该不会太困难,或者提供一个新接口来指定额外的PrepareGeneric方法,该方法可以猜测包装sql.DB的风味,并提供类似的翻译。

Gorp使用方言类型,这可能值得一看。

只是抛出想法。