我最近实施了使用database/sql
包的a package。通过将SQL限制为非常简单的select / update / insert语句,我假设该包可以与database/sql
支持的所有DBMS一起使用。
但是,事实证明有些数据库使用?
作为占位符值,而其他数据库则使用$1
,$2
等,这意味着准备好的语句可以与某些DBMS一起使用但不能和其他人一起。
所以我想知道是否有任何技术可以通过所有支持的驱动程序以通用方式完成这项工作?或者是否有必要在任何地方使用特定于DBMS的代码? (我认为这会使database/sql
提供的抽象有点无意义)。我想使用非预处理语句也不是一种选择,因为不同的DBMS有不同的方法来转义参数。
有什么建议吗?
答案 0 :(得分:1)
我认为这种行为被特别排除,因为SQL方言在数据库之间存在显着差异,Go团队希望避免为每个驱动程序编写预处理器以将“GoSQL”转换为本机SQL。数据库/ sql包主要提供连接争论,这是一个抽象,属于“非常必要”而不是语句翻译,这更加“很好”。
那就是说,我同意重写每一句话是一件非常麻烦的事。但是,使用正则表达式将database / sql / driver.Prepare()方法包装为用标准占位符替换本机占位符不应该太难,或者提供一个新接口来指定另一个猜测包装的PrepareGeneric方法sql.DB味道,并提供类似的翻译。
Gorp
使用方言类型,这可能值得一看。
只是抛出想法。