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:
connect(connectionString),disconnect(),isConnectedquery(sql, params?)→ array di oggetti riga;queryOne(sql, params?)→ una riga o null;execute(sql, params?)→ righe interessate- Query builder:
select(...columns).from(table).where(column, operator, value).query()—where(column, value)significa= insert(table, values);update(table, values)edelete(table)richiedono unwhereprecedentebeginTransaction(),commit(),rollback()
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 Server | PostgreSQL | |
|---|---|---|
| Classe | SqliteClient / SqlServerClient | PostgresClient |
| Connection string | SQLite: 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
- 33. Esempi - Campioni del catalogo
- 12. Input/Output - File e path