Git Product home page Git Product logo

tnt's Introduction

tnt

Tarantool driver for Go's database/sql package based on go-tarantool library.

Example of usage

package main

import (
	"context"
	"database/sql"
	"log"

	_ "github.com/aeroideaservices/tnt"
)

func main() {
	db := sql.Open("tnt", "tarantool://user:password@localhost:3301")
	ctx := context.Background()
	_, err := db.ExecContext(ctx, `CREATE TABLE modules (name STRING, size INTEGER, purpose STRING, PRIMARY KEY (name));`)
	if err != nil {
		log.Fatal(err)
	}
	_, err = db.ExecContext(ctx, `CREATE INDEX size ON modules (size);`)
	if err != nil {
		log.Fatal(err)
	}
	_, err = db.ExecContext(ctx, `CREATE UNIQUE INDEX purpose ON modules (purpose);`)
	if err != nil {
		log.Fatal(err)
	}

	_, err = db.ExecContext(ctx, `
	INSERT INTO modules VALUES ('box', 1432, 'Database Management'),
	('clock', 188, 'Seconds'), ('crypto', 4, 'Cryptography');
	`)
	if err != nil {
		log.Fatal(err)
	}

	rows, err := db.QueryContext(ctx, `SELECT size FROM modules WHERE name = ?;`, "clock")
	if err != nil {
		log.Fatal(err)
	}
	defer rows.Close()

	for rows.Next() {
		var size int
		err = rows.Scan(&size)
		if err != nil {
			log.Fatal(err)
		}
		log.Printf("size: %d\n", size)
	}

	if err := rows.Err(); err != nil {
		log.Fatal(err)
	}
}

Принцип работы

В двух словах, все здесь нужно, что бы имплементировать интерфейс драйвера из библиотеки database/sql.

  • Основная часть кода находится в файле driver.go
  • Часть, отвечающая за транзакции в файле transaction.go
  • Часть, отвечающая за сторки, которые мы получаем через SELECT rows.go
  • Часть, отвечающая за "выражения", а в нашем случае также и за фактическое обращение к тарантулу stmt.go

Также в stmt.go находится часть, связанная с разобром аргуменов в SQL запросе и их касты для нестандартных типов

tnt's People

Watchers

 avatar

tnt's Issues

Transactions

Сейчас для удобства доступна лишь одна транзакция на соединение, нужно попробовать сделать несколько, кажется что благодаря потокам это можно реализовать, стоит изучить этот вопрос

Named parameters

Сейчас драйвер поддерживает только неименованные параметры
rows, err := db.QueryContext(ctx, `SELECT size FROM modules WHERE name = ?;`, "clock")
Нужно добавить поддержку именованных параметров, для этого нужно исправить функции для парсинга и билда аргументов
file

Prepared

Сейчас prepared statements под капотом просто выполняет запрос, т.е. выражение prepared на уровне драйвера, а хотелось бы использовать prepared statements из тарантула

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.