Manuale di riferimento MALDA™

Il linguaggio di programmazione AI-First - Versione 1.0.11

16. Supporto database

MALDA distribuisce tre client con la stessa API: SqliteClient, SqlServerClient e PostgresClient. Parti da SQLite: è un file su disco, senza server. Connessione, SQL parametrizzato, query builder, insert e transazioni sono identici sugli altri due; cambiano solo connection string e sintassi dei placeholder.

16.1 SQLite da zero

Connetti, crea una tabella, inserisci, interroghi, disconnetti. I parametri usano @name (non concatenare mai input utente nel SQL).

var db = new SqliteClient();
db.connect("Data Source=app.db;");

db.execute("CREATE TABLE IF NOT EXISTS users (id INTEGER PRIMARY KEY, name TEXT, email TEXT, age INTEGER)");
db.insert("users", {name: "Jane", email: "jane@example.com", age: 30});

var users = db.query("SELECT name, email FROM users WHERE age > @age", {age: 25});
for (var i = 0; i < users.length; i++) {
    print(users[i].name + " - " + users[i].email);
}

var one = db.select("name", "email")
            .from("users")
            .where("age", ">", 25)
            .query();

db.disconnect();

Costruttore: new SqliteClient() oppure new SqliteClient(connectionString). Connection string: Data Source=path/to/db.sqlite;.

16.2 API condivisa dei client

Tutte e tre le classi espongono:

db.beginTransaction();
try {
    db.execute("INSERT INTO users (name) VALUES (@name)", {name: "Test"});
    db.commit();
} catch (e) {
    db.rollback();
}

I risultati delle query sono array di oggetti le cui property sono i nomi delle colonne:

var users = db.query("SELECT name, email FROM users");
print(users[0].name + " - " + users[0].email);

16.3 SQL Server e PostgreSQL

Stessi metodi, connection string e placeholder diversi. Il query builder numera da solo i parametri PostgreSQL.

SQLite / SQL ServerPostgreSQL
ClasseSqliteClient / SqlServerClientPostgresClient
Connection stringSQLite: Data Source=app.db;
SQL Server: Server=localhost;Database=mydb;User Id=user;Password=pass;
Host=localhost;Database=mydb;Username=user;Password=pass;
Placeholder nel SQL grezzo@age con {age: 25}$1 con {$1: 25}
var sql = new SqlServerClient();
sql.connect("Server=localhost;Database=mydb;User Id=user;Password=pass;");
var rows = sql.query("SELECT * FROM users WHERE age > @age", {age: 25});
sql.disconnect();

var pg = new PostgresClient();
pg.connect("Host=localhost;Database=mydb;Username=user;Password=pass;");
var rows2 = pg.query("SELECT * FROM users WHERE age > $1", {$1: 25});
pg.disconnect();

16.4 Sicurezza

Tutti i client usano query parametrizzate. Passa sempre i parametri come oggetto invece di concatenare stringhe.

Importante: Non concatenare mai input utente direttamente nelle query SQL. Usa sempre query parametrizzate per prevenire attacchi di SQL injection.

Vedi anche