blob: 0e653029c32150574b77c11a8c9509fa1b8dfe9f [file] [log] [blame] [view]
<!--{
"Title": "Accessing relational databases",
"Breadcrumb": true
}-->
Using Go, you can incorporate a wide variety of databases and data access
approaches into your applications. Topics in this section describe how to use
the standard library's [`database/sql`](https://pkg.go.dev/database/sql)
package to access relational databases.
For an introductory tutorial to data access with Go, please see
[Tutorial: Accessing a relational database](/doc/tutorial/database-access).
Go supports other data access technologies as well, including ORM libraries
for higher-level access to relational databases, and also non-relational
NoSQL data stores.
* **Object-relational mapping (ORM) libraries.** While the `database/sql`
package includes functions for lower-level data access logic, you can
also use Go to access data stores at a higher abstraction level. For more
about two popular object-relational mapping (ORM) libraries for Go, see
[GORM](https://gorm.io/index.html) ([package reference](https://pkg.go.dev/gorm.io/gorm))
and [ent](https://entgo.io/) ([package reference](https://pkg.go.dev/entgo.io/ent)).
* **NoSQL data stores.** The Go community has developed drivers for the
majority of NoSQL data stores, including [MongoDB](https://docs.mongodb.com/drivers/go/)
and [Couchbase](https://docs.couchbase.com/go-sdk/current/hello-world/overview.html).
You can search [pkg.go.dev](https://pkg.go.dev/) for more.
### Supported database management systems {#supported_dbms}
Go supports all of the most common relational database management systems,
including MySQL, Oracle, Postgres, SQL Server, SQLite, and more.
You'll find a complete list of drivers at the
[SQLDrivers](https://github.com/golang/go/wiki/SQLDrivers) page.
### Functions to execute queries or make database changes {#functions}
The `database/sql` package includes functions specifically designed for the
kind of database operation you're executing. For example, while you can use
`Query` or `QueryRow` to execute queries, `QueryRow` is designed for the case
when you're expecting only a single row, omitting the overhead of returning
an `sql.Rows` that includes only one row. You can use the `Exec` function
to make database changes with SQL statements such as `INSERT`, `UPDATE`, or
`DELETE`.
For more, see the following:
* [Executing SQL statements that don't return data](/doc/database/change-data)
* [Querying for data](/doc/database/querying)
### Transactions {#transactions}
Through `sql.Tx`, you can write code to execute database operations in a
transaction. In a transaction, multiple operations can be performed together
and conclude with a final commit, to apply all the changes in one atomic
step, or a rollback, to discard them.
For more about transactions, see [Executing transactions](/doc/database/execute-transactions).
### Query cancellation {#query_cancellation}
You can use `context.Context` when you want the ability to cancel a database
operation, such as when the client's connection closes or the operation runs
longer than you want it to.
For any database operation, you can use a `database/sql` package function
that takes `Context` as an argument. Using the `Context`, you can specify a
timeout or deadline for the operation. You can also use the `Context` to
propagate a cancellation request through your application to the function
executing an SQL statement, ensuring that resources are freed up if they're
no longer needed.
For more, see [Canceling in-progress operations](/doc/database/cancel-operations).
### Managed connection pool {#connection_pool}
When you use the `sql.DB` database handle, you're connecting with a built-in
connection pool that creates and disposes of connections according to your
code's needs. A handle through `sql.DB` is the most common way to do
database access with Go. For more, see
[Opening a database handle](/doc/database/open-handle).
The `database/sql` package manages the connection pool for you. However, for
more advanced needs, you can set connection pool properties as described in
[Setting connection pool properties](/doc/database/manage-connections#connection_pool_properties).
For those operations in which you need a single reserved connection, the
`database/sql` package provides [`sql.Conn`](https://pkg.go.dev/database/sql#Conn).
`Conn` is especially useful when a transaction with `sql.Tx` would be a
poor choice.
For example, your code might need to:
* Make schema changes through a DDL, including logic that contains its
own transaction semantics. Mixing `sql` package transaction functions with
SQL transaction statements is a poor practice, as described in
[Executing transactions](/doc/database/execute-transactions).
* Perform query locking operations that create temporary tables.
For more, see [Using dedicated connections](/doc/database/manage-connections#dedicated_connections).