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(godror.NewDriver())
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", testDSN)
if err != nil {
log.Fatalf("failed to create grpc database: %v", err)
}
defer db.Close()
tx, err := db.Begin()
if err != nil {
log.Fatalf("failed to create grpc transaction: %v", err)
}
defer tx.Rollback()
const tbl = "test_grpc"
tx.Exec("DROP TABLE " + tbl)
defer tx.Exec("DROP TABLE " + tbl)
if _, err := tx.Exec("CREATE TABLE " + tbl + " (n INTEGER)"); err != nil {
log.Fatalf("failed to execute create table statement over grpc: %v", err)
}
if _, err := tx.Exec("INSERT INTO " + tbl + "(n) VALUES (1)"); err != nil {
log.Fatalf("failed to execute INSERT statement over grpc: %v", err)
}
result, err := tx.Exec("INSERT INTO " + tbl + "(n) VALUES (2)")
if err != nil {
log.Fatalf("failed to execute insert statement over grpc: %v", err)
}
rows, err := tx.Query("SELECT n FROM " + tbl + " 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 ¶
- func NewServer(driver driver.DriverContext, opt ...grpc.ServerOption) *grpc.Server
- type Conn
- func (c *Conn) Begin() (driver.Tx, error)
- func (c *Conn) BeginTx(ctx context.Context, opts driver.TxOptions) (driver.Tx, error)
- func (c *Conn) Close() error
- func (c *Conn) Exec(query string, args []driver.Value) (driver.Result, error)deprecated
- func (c *Conn) Prepare(query string) (driver.Stmt, error)
- type Dialer
- type Driver
- type Gateway
- type Result
- type Rows
- type Stmt
- type Tx
Examples ¶
Constants ¶
This section is empty.
Variables ¶
This section is empty.
Functions ¶
func NewServer ¶
func NewServer(driver driver.DriverContext, opt ...grpc.ServerOption) *grpc.Server
NewServer is a convenience for creating a gRPC server with a registered SQL gateway backed by the given driver.
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 {
protocol.UnimplementedSQLServer
// contains filtered or unexported fields
}
Gateway mapping gRPC requests to SQL queries.
func NewGateway ¶
func NewGateway(drv driver.DriverContext) *Gateway
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.