Description
It would be really nice if the new sql.Conn
type had a method to access the underlying driver.Conn
, similar to how net.TCPConn
has the SyscallConn
method. This would allow access to custom driver methods that don't map to the standard driver.Conn
interface. For example, the mattn driver for SQLite exposes a Backup
method on its *SQLiteConn
object, but you cannot really call it once you are in the database/sql world.
Specifically, I propose adding a new method to sql.Conn
as follows:
func (c *Conn) RawControl(func(driver.Conn) error) error
The driver.Conn
provided to the callback must only be used within the callback. (Just like the fd cannot be used outside the callback for syscall.RawConn
.) Until the callback function returns, that particular driver.Conn
is "in use" and cannot be used concurrently by any other goroutine.
An equivalent method could also be added to sql.DB
itself, but that doesn't seem necessary.
Sample use case:
db, _ := sql.Open("sqlite3", "...")
...
c, err := db.Conn(ctx)
if err != nil {
panic(err)
}
defer c.Close()
err = c.RawControl(func (rc driver.Conn) error {
c2, err := new(sqlite3.Driver).Open("backup.sqlite")
if err != nil {
return err
}
defer c2.Close()
c2.Backup("main", rc.(*sqlite3.Conn), "main")
...
})
...