第 3 部分 · 应用开发实战
数据库操作
数据库操作
连接 SQLite 和 PostgreSQL 数据库,执行查询与管理迁移。
SQLite
#lang racket (require db sqlite-table) ;; 连接 SQLite (define conn (sqlite3-connect #:database "app.db")) ;; 创建表 (query-exec conn "CREATE TABLE IF NOT EXISTS users ( id INTEGER PRIMARY KEY, name TEXT NOT NULL, email TEXT UNIQUE NOT NULL)") ;; 插入数据 (query-exec conn "INSERT INTO users (name, email) VALUES ($1, $2)" "Alice" "alice@example.com") ;; 查询 (query-rows conn "SELECT * FROM users") ;; => '(#(1 "Alice" "alice@example.com")) ;; 参数化查询 (define (find-user name) (query-maybe-row conn "SELECT * FROM users WHERE name = $1" name))
PostgreSQL
(require db) (define pg-conn (postgresql-connect #:user "postgres" #:database "myapp" #:password "secret")) ;; 事务 (call-with-transaction pg-conn (lambda () (query-exec pg-conn "INSERT INTO orders (...) VALUES (...)") (query-exec pg-conn "UPDATE inventory SET stock = stock - 1")))
连接池
(define pool (connection-pool (lambda () (sqlite3-connect #:database "app.db")))) (with-pool-connection pool (lambda (conn) (query-rows conn "SELECT * FROM users")))
小结
Racket 的 db 库提供了统一的数据库接口。参数化查询防止 SQL 注入,事务保证数据一致性。