|
package main |
|
|
|
import ( |
|
"database/sql" |
|
"fmt" |
|
"log" |
|
"os" |
|
|
|
"github.com/joho/godotenv" |
|
_ "github.com/tursodatabase/libsql-client-go/libsql" |
|
) |
|
|
|
type User struct { |
|
ID int |
|
Name string |
|
} |
|
|
|
func main() { |
|
err := godotenv.Load() |
|
if err != nil { |
|
log.Fatalf("Error loading .env file: %s", err) |
|
} |
|
|
|
// 環境変数から取得 |
|
dbURL := os.Getenv("TURSO_DATABASE_URL") |
|
authToken := os.Getenv("TURSO_AUTH_TOKEN") |
|
|
|
if dbURL == "" || authToken == "" { |
|
log.Fatal("TURSO_DATABASE_URL または TURSO_AUTH_TOKEN が設定されていません") |
|
} |
|
|
|
// 接続文字列にトークンを付与 |
|
fullURL := fmt.Sprintf("%s?authToken=%s", dbURL, authToken) |
|
|
|
// DB 接続 |
|
db, err := sql.Open("libsql", fullURL) |
|
if err != nil { |
|
log.Fatalf("failed to open db: %v", err) |
|
} |
|
defer db.Close() |
|
|
|
// テーブル作成(もしまだなら) |
|
_, err = db.Exec(`CREATE TABLE IF NOT EXISTS users ( |
|
id INTEGER PRIMARY KEY AUTOINCREMENT, |
|
name TEXT NOT NULL |
|
);`) |
|
if err != nil { |
|
log.Fatalf("failed to create table: %v", err) |
|
} |
|
|
|
// データ登録 INSERT |
|
insertUser(db, "Taro") |
|
insertUser(db, "Hanako") |
|
// 削除: ID=2 のユーザーを削除 |
|
if err := deleteUser(db, 3); err != nil { |
|
log.Println(err) |
|
} |
|
// 更新: ID=1 のユーザーを "Jiro" に変更 |
|
if err := updateUser(db, 1, "Jiro-up"); err != nil { |
|
log.Println(err) |
|
} |
|
|
|
// 一覧取得 SELECT |
|
users, err := listUsers(db) |
|
if err != nil { |
|
log.Fatalf("failed to list users: %v", err) |
|
} |
|
|
|
for _, u := range users { |
|
fmt.Printf("ID=%d, Name=%s\n", u.ID, u.Name) |
|
} |
|
} |
|
|
|
func insertUser(db *sql.DB, name string) { |
|
result, err := db.Exec("INSERT INTO users (name) VALUES (?)", name) |
|
if err != nil { |
|
log.Printf("failed to insert user: %v", err) |
|
return |
|
} |
|
id, err := result.LastInsertId() |
|
if err != nil { |
|
log.Printf("failed to get last insert id: %v", err) |
|
return |
|
} |
|
log.Printf("Inserted user %s with ID %d", name, id) |
|
} |
|
|
|
func listUsers(db *sql.DB) ([]User, error) { |
|
rows, err := db.Query("SELECT id, name FROM users") |
|
if err != nil { |
|
return nil, err |
|
} |
|
defer rows.Close() |
|
|
|
var users []User |
|
for rows.Next() { |
|
var u User |
|
if err := rows.Scan(&u.ID, &u.Name); err != nil { |
|
return nil, err |
|
} |
|
users = append(users, u) |
|
} |
|
if err := rows.Err(); err != nil { |
|
return nil, err |
|
} |
|
return users, nil |
|
} |
|
|
|
func deleteUser(db *sql.DB, id int) error { |
|
result, err := db.Exec("DELETE FROM users WHERE id = ?", id) |
|
if err != nil { |
|
return fmt.Errorf("failed to delete user: %w", err) |
|
} |
|
|
|
rows, err := result.RowsAffected() |
|
if err != nil { |
|
return fmt.Errorf("failed to get rows affected: %w", err) |
|
} |
|
|
|
if rows == 0 { |
|
log.Printf("No user found with ID=%d", id) |
|
} else { |
|
log.Printf("Deleted user ID=%d", id) |
|
} |
|
return nil |
|
} |
|
|
|
func updateUser(db *sql.DB, id int, newName string) error { |
|
result, err := db.Exec("UPDATE users SET name = ? WHERE id = ?", newName, id) |
|
if err != nil { |
|
return fmt.Errorf("failed to update user: %w", err) |
|
} |
|
|
|
rows, err := result.RowsAffected() |
|
if err != nil { |
|
return fmt.Errorf("failed to get rows affected: %w", err) |
|
} |
|
|
|
if rows == 0 { |
|
log.Printf("No user found with ID=%d", id) |
|
} else { |
|
log.Printf("Updated user ID=%d, newName=%s", id, newName) |
|
} |
|
return nil |
|
} |