Slide 33 de 37

SQL

type User { id: Int, name: Str }

query findUser(name: Str): User[dyn] {
	SELECT id, name FROM users WHERE name = {name}
}

proc main(): void {
	pooled := hive.sql.pool(hive.sql.DatabaseDriver.SQLite(), "file::memory:?cache=shared", 1, 1)
	if pooled is Result.Ok(db) {
		using db run raw "CREATE TABLE users (id INTEGER, name TEXT)"
		using db run raw "INSERT INTO users (id, name) VALUES (1, 'ada')"

		found := using db run findUser("ada")
		if found is Result.Ok(users) {
			echo users
		}
		hive.sql.close(db)
	} else if pooled is Result.Error(err) {
		echo "não foi possível abrir o banco de dados: {err.message}"
	}
}
Uma declaração query é um func cujo corpo é SQL inline e cujo tipo de retorno descreve suas linhas. Colunas são associadas a campos pelo nome, não pela posição, então reordenar um SELECT nunca pode remapeá-las silenciosamente, e valores são sempre vinculados como parâmetros — nunca inseridos diretamente no texto — então nada que quem chama fornecer pode mudar o que a instrução significa. connect abre uma única conexão e pool abre um pool inteiro delas, ambos respondendo com um Result<SqlConnection, SqlError>; close libera uma. SQL montado em tempo de execução, em vez de declarado como uma query, passa por run raw em vez disso — sem tipo por construção, e fácil de encontrar com grep.