跳转至

SQL 01:好莱坞级多表关联设计与 Python+SQLite 极速起步

SQL(结构化查询语言)

Python 是过程式语言(你要告诉计算机“怎么做”),而 SQL 是声明式语言(你只需要告诉数据库“我要什么数据”),它非常符合人类的直觉。

构建一个轻量级的 CG 资产与镜头管理数据库


💡 SQL 核心只有四个字:增、删、改、查

在实际管线开发中,你最常用的 80% 的操作,其实就是这四个动作。我们直接用 Python 的 sqlite3 来演示,你连软件都不用装,直接新建一个 .py 脚本就能跑。

1. 增 (Create):建表并塞入资产

我们要先建立一个存储镜头的表格,然后往里面塞入《哪吒》或《王者》里的一些模拟资产数据。

import sqlite3

# 连上数据库(内存模式,关掉程序数据就消失,最适合练手)
conn = sqlite3.connect(':memory:')
cursor = conn.cursor()

# 【SQL语句 1】:创建一张镜头资产表
# 我们定义了:镜头号、负责的小组、渲染耗时、是否完成
cursor.execute('''
CREATE TABLE IF NOT EXISTS shots (
    shot_id TEXT PRIMARY KEY,
    department TEXT,
    render_hours REAL,
    is_done INTEGER
)
''')

# 【SQL语句 2】:往表里“增”几条管线数据
shot_data = [
    ('shot_001', 'Layout', 0.5, 1),
    ('shot_002', 'Animation', 2.5, 1),
    ('shot_003', 'Lighting', 14.2, 0),
    ('shot_004', 'Lighting', 8.5, 0),
    ('shot_005', 'FX', 22.1, 0)
]

cursor.executemany("INSERT INTO shots VALUES (?, ?, ?, ?)", shot_data)
conn.commit()
print("--- 资产数据库初始化成功 ---")

2. 查 (Read):管线里的“超级筛选器”

数据存进去了,身为 TD,总监可能会天天问你要各种报表。这时候 SQL 的查询(SELECT)就派上用场了。

场景 A:找出所有还没完成(is_done = 0)的镜头

# SQL 语法:SELECT 字段 FROM 表名 WHERE 条件
cursor.execute("SELECT shot_id, department FROM shots WHERE is_done = 0")
print("未完成的镜头:", cursor.fetchall())
# 输出: [('shot_003', 'Lighting'), ('shot_004', 'Lighting'), ('shot_005', 'FX')]

场景 B:找出渲染耗时大于 10 小时的重度镜头,按耗时从高到低排序

# SQL 语法:ORDER BY 字段 DESC (倒序)
cursor.execute("SELECT shot_id, render_hours FROM shots WHERE render_hours > 10 ORDER BY render_hours DESC")
print("高负载镜头排行:", cursor.fetchall())
# 输出: [('shot_005', '22.1'), ('shot_003', '14.2')]

3. 改 (Update) 与 删 (Delete):动态调整状态

当动画师或特效师提交了工作,或者管线策略变了,你就需要用代码去修改它。

场景 C:Lighting 组的 shot_003 终于渲染完了,更新它的状态

# SQL 语法:UPDATE 表名 SET 字段=新值 WHERE 条件
cursor.execute("UPDATE shots SET is_done = 1 WHERE shot_id = 'shot_003'")
conn.commit()

# 检查一下是不是改成功了
cursor.execute("SELECT shot_id, is_done FROM shots WHERE shot_id = 'shot_003'")
print("更新后的状态:", cursor.fetchall()) # 输出: [('shot_003', 1)]

场景 D:shot_005 导演决定砍掉了,从数据库删除

# SQL 语法:DELETE FROM 表名 WHERE 条件
cursor.execute("DELETE FROM shots WHERE shot_id = 'shot_005'")
conn.commit()

🛠️ 思路扩展

  1. 怎么设计表结构(网状的管线里,怎么用外键把镜头、资产、制作人串联起来)?
  2. 怎么用 SQL 的聚合函数(一键算全项目的总渲染成本、平均耗时等)?