Racket 编程

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 注入,事务保证数据一致性。