Documentation
¶
Overview ¶
Package grpcsql exposes a SQL database over a gRPC endpoint.
Example ¶
listener, err := net.Listen("tcp", ":0")
if err != nil {
log.Fatalf("failed to create listener: %v", err)
}
server := grpcsql.NewServer(&sqlite3.SQLiteDriver{})
go server.Serve(listener)
defer server.Stop()
dialer := func() (*grpc.ClientConn, error) {
return grpc.Dial(listener.Addr().String(), grpc.WithInsecure())
}
driver := grpcsql.NewDriver(dialer)
sql.Register("grpc", driver)
db, err := sql.Open("grpc", ":memory:")
if err != nil {
log.Fatalf("failed to create grpc database: %s", err)
}
defer db.Close()
tx, err := db.Begin()
if err != nil {
log.Fatalf("failed to create grpc transaction: %s", err)
}
defer tx.Rollback()
result, err := tx.Exec("CREATE TABLE test (n INTEGER); INSERT INTO test(n) VALUES (1)")
if err != nil {
log.Fatalf("failed to execute create table statement over grpc: %s", err)
}
result, err = tx.Exec("INSERT INTO test(n) VALUES (2)")
if err != nil {
log.Fatalf("failed to execute insert statement over grpc: %s", err)
}
rows, err := tx.Query("SELECT n FROM test ORDER BY n")
if err != nil {
log.Fatalf("failed to select rows over grpc: %s", err)
}
types, err := rows.ColumnTypes()
if len(types) != 1 {
log.Fatalf("wrong count of column types: %d", len(types))
}
name := types[0].DatabaseTypeName()
if err != nil {
log.Fatalf("failed to fetch column types over grpc: %s", err)
}
numbers := []int{}
for rows.Next() {
var n int
if err := rows.Scan(&n); err != nil {
log.Fatalf("failed to scan row over grpc: %s", err)
}
numbers = append(numbers, n)
}
if err := rows.Err(); err != nil {
log.Fatalf("rows error over grpc: %s", err)
}
defer rows.Close()
Output: 2 <nil> 1 <nil> INTEGER [1 2]
Index ¶
Examples ¶
Constants ¶
This section is empty.
Variables ¶
This section is empty.
Functions ¶
Types ¶
type Conn ¶
type Conn struct {
// contains filtered or unexported fields
}
Conn wraps a connection to a gRPC SQL gateway.
func (*Conn) Close ¶
Close invalidates and potentially stops any current prepared statements and transactions, marking this connection as no longer in use.
type Dialer ¶
type Dialer func() (conn *grpc.ClientConn, err error)
Dialer is a function that can create a gRPC connection.
type Driver ¶
type Driver struct {
// contains filtered or unexported fields
}
Driver implements the database/sql/driver interface and executes the relevant statements over gRPC.
func NewDriver ¶
NewDriver creates a new gRPC SQL driver for creating connections to backend gateways.
type Gateway ¶
type Gateway struct {
// contains filtered or unexported fields
}
Gateway mapping gRPC requests to SQL queries.
func NewGateway ¶
NewGateway creates a new gRPC gateway executing requests against the given SQL driver.
type Result ¶
type Result struct {
// contains filtered or unexported fields
}
Result is the result of a query execution.
func (*Result) LastInsertId ¶
LastInsertId returns the database's auto-generated ID.
func (*Result) RowsAffected ¶
RowsAffected returns the number of rows affected by the query.
type Rows ¶
type Rows struct {
// contains filtered or unexported fields
}
Rows is an iterator over an executed query's results.
func (*Rows) ColumnTypeDatabaseTypeName ¶
ColumnTypeDatabaseTypeName implements RowsColumnTypeDatabaseTypeName.
func (*Rows) ColumnTypeScanType ¶
ColumnTypeScanType implements RowsColumnTypeScanType.
type Stmt ¶
type Stmt struct {
// contains filtered or unexported fields
}
Stmt is a prepared statement. It is bound to a Conn and not used by multiple goroutines concurrently.
