# -*- coding: utf-8 -*- """数据模型:使用 sqlite3 管理车辆数据""" import sqlite3 import os DB_PATH = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'vehicles.db') def get_conn(): """获取数据库连接,返回 Row 类型便于转字典""" conn = sqlite3.connect(DB_PATH) conn.row_factory = sqlite3.Row return conn def init_db(): """初始化数据库表""" conn = get_conn() conn.execute(''' CREATE TABLE IF NOT EXISTS vehicles ( id INTEGER PRIMARY KEY AUTOINCREMENT, plate TEXT NOT NULL UNIQUE, brand TEXT NOT NULL, model TEXT NOT NULL, year INTEGER, color TEXT, status TEXT DEFAULT 'available', owner TEXT ) ''') conn.commit() conn.close() def list_vehicles(keyword=None): """列出车辆,可按关键字搜索""" conn = get_conn() if keyword: like = f'%{keyword}%' rows = conn.execute( 'SELECT * FROM vehicles WHERE plate LIKE ? OR brand LIKE ? OR model LIKE ? ORDER BY id DESC', (like, like, like) ).fetchall() else: rows = conn.execute('SELECT * FROM vehicles ORDER BY id DESC').fetchall() conn.close() return [dict(r) for r in rows] def get_vehicle(vid): """获取单条车辆""" conn = get_conn() row = conn.execute('SELECT * FROM vehicles WHERE id = ?', (vid,)).fetchone() conn.close() return dict(row) if row else None def add_vehicle(data): """新增车辆""" conn = get_conn() cur = conn.execute( 'INSERT INTO vehicles (plate, brand, model, year, color, status, owner) VALUES (?, ?, ?, ?, ?, ?, ?)', (data.get('plate'), data.get('brand'), data.get('model'), data.get('year'), data.get('color'), data.get('status', 'available'), data.get('owner')) ) conn.commit() vid = cur.lastrowid conn.close() return vid def update_vehicle(vid, data): """更新车辆""" conn = get_conn() conn.execute( 'UPDATE vehicles SET plate=?, brand=?, model=?, year=?, color=?, status=?, owner=? WHERE id=?', (data.get('plate'), data.get('brand'), data.get('model'), data.get('year'), data.get('color'), data.get('status'), data.get('owner'), vid) ) conn.commit() conn.close() def delete_vehicle(vid): """删除车辆""" conn = get_conn() conn.execute('DELETE FROM vehicles WHERE id = ?', (vid,)) conn.commit() conn.close() def stats(): """统计信息""" conn = get_conn() total = conn.execute('SELECT COUNT(*) AS c FROM vehicles').fetchone()['c'] rows = conn.execute('SELECT status, COUNT(*) AS c FROM vehicles GROUP BY status').fetchall() conn.close() by_status = {r['status']: r['c'] for r in rows} return {'total': total, 'by_status': by_status}