使用数据库/sql 包创建泛型代码



我最近实现了一个使用database/sql包的包。通过将SQL限制为非常简单的选择/更新/插入语句,我假设该软件包将与database/sql支持的所有DBMS一起使用。

然而,事实证明,一些数据库使用 ? 作为占位符值,而另一些数据库使用 $1$2 等,这意味着准备好的语句将适用于某些 DBMS,但不适用于其他 DBMS。

所以我想知道是否有任何技术可以使用所有支持的驱动程序以通用方式完成这项工作?还是有必要在任何地方都有特定于 DBMS 的代码?(我认为这将使database/sql提供的抽象有点毫无意义)。我想使用非预准备语句也不是一种选择,因为不同的 DBMS 有不同的方法来转义参数。

有什么建议吗?

我认为这种行为被特别省略了,因为SQL方言在数据库之间差异很大,Go团队希望避免为每个驱动程序编写预处理器来将"GoSQL"转换为本机SQL。数据库/sql 包主要提供连接争用,这是一种属于"非常必要"而不是语句翻译的抽象,后者更"很高兴拥有"。

也就是说,我同意重写每个陈述是一个主要的麻烦。包装数据库/sql/驱动程序应该不会太难。但是,带有正则表达式的 Prepare() 方法将标准占位符替换为本机占位符,或者提供一个新接口来指定一个额外的 PrepareGeneric 方法来猜测包装的 sql。DB风味,并提供类似的翻译。

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

只是抛出想法。

最新更新