基于PostgreSQL实现的俄罗斯方块游戏项目Tetris-SQL,通过纯SQL代码和数据库操作重构了经典游戏逻辑,展现了SQL语言的图灵完备性和技术潜力。
1.游戏安装
1. 先安装一个PostgreSQL数据库 [postgres@pghost ~]$psql psql (15.8) 2.安装 psycopg2 yum install postgresql-devel python3-devel yum install -y python3-psycopg2 pip3 install psycopg2 pip3 install psycopg2-binary 3.游戏代码克隆 git clone https://github.com/nuno-faria/tetris-sql chmod +x ./tetris-sql/input.py
复制
2.游戏使用
1.本地运行 Python python3 input.py \ [-h] [-H HOST] [-P PORT] \ [-d DB] [-u USER] [-p PASSWORD] 2.另一个终端运行以下查询 psql -U postgres -f tetris-sql/game.sql 说明: game.sql 用于实现游戏逻辑,主要涉及通用表表达式(CTE)实现游戏循环; input.py 用于捕获键盘输入。
复制
3.PL/pgSQL能做什么?
其实上面这个游戏PL/pgSQL(PostgreSQL的过程化语言)为核心,结合数据库表、查询语句和存储过程实现游戏逻辑,核心代码仅500余行。虽然包含少量Python脚本,但仅用于将用户输入(如键盘操作)转换为SQL命令,不参与核心逻辑处理。
PL/pgSQL的功能其实非常的强大,让我们一起来回顾下
3.1 敏感数据自动加密
通过触发器在数据写入前加密,读取时解密,例如为users表的phone字段添加加密逻辑:
CREATE TRIGGER encrypt_phone BEFORE INSERT ON users FOR EACH ROW EXECUTE FUNCTION encrypt_data();
复制
3.2 定时数据清理
结合pg_cron扩展,定期清理日志表:
CREATE OR REPLACE FUNCTION clean_old_logs() RETURNS VOID AS $$ BEGIN DELETE FROM logs WHERE created_at < NOW() - INTERVAL '30 days'; END; $$ LANGUAGE plpgsql; -- 每天凌晨执行 SELECT cron.schedule('0 0 * * *', 'SELECT clean_old_logs()');
复制
2.3 大数据迁移与转换
使用游标逐批处理千万级数据迁移:
CREATE OR REPLACE FUNCTION migrate_legacy_data() RETURNS VOID AS $$ DECLARE batch_size INT := 1000; c CURSOR FOR SELECT * FROM legacy_table; r RECORD; BEGIN OPEN c; LOOP FETCH c INTO r; EXIT WHEN NOT FOUND; INSERT INTO new_table VALUES (r.id, transform_data(r.raw_content)); IF (count % batch_size = 0) THEN COMMIT; END IF; END LOOP; CLOSE c; END; $$ LANGUAGE plpgsql;
复制
2.4 与Linux交互备份表
通过PL/pgSQL结合COPY命令实现PostgreSQL表数据备份的存储过程脚本,包含动态参数、异常处理和文件路径验证功能:
CREATE OR REPLACE PROCEDURE backup_table( table_name TEXT, file_path TEXT DEFAULT '/tmp/backup/' ) LANGUAGE plpgsql AS $$ DECLARE full_path TEXT; backup_cmd TEXT; file_suffix TEXT := to_char(CURRENT_TIMESTAMP, 'YYYYMMDD_HH24MISS'); BEGIN -- 验证表是否存在[7](@ref) IF NOT EXISTS ( SELECT 1 FROM information_schema.tables WHERE table_name = $1 AND table_schema = 'public' ) THEN RAISE EXCEPTION 'Table % does not exist', table_name; END IF; -- 生成带时间戳的文件路径 full_path := file_path || table_name || '_' || file_suffix || '.csv'; -- 构建COPY命令(自动处理列名)[6](@ref) backup_cmd := format( 'COPY (SELECT * FROM %I) TO %L WITH (FORMAT CSV, HEADER, ENCODING ''UTF8'')', table_name, full_path ); -- 执行备份命令 BEGIN EXECUTE backup_cmd; RAISE NOTICE 'Table % backed up to %', table_name, full_path; EXCEPTION WHEN insufficient_privilege THEN RAISE EXCEPTION 'Permission denied for path: %', file_path; WHEN others THEN RAISE EXCEPTION 'Backup failed: %', SQLERRM; END; END; $$;
复制
PL/pgSQL通过将逻辑贴近数据存储,显著降低了网络延迟和代码冗余。其与PostgreSQL生态的深度集成(如PostGIS、pg_cron),使其成为企业级数据处理的核心工具。
总结
Tetris-SQL证明编程的本质在于逻辑表达,而非语言类型。通过创意实现,SQL可扩展至游戏开发、模拟仿真等领域,成为“趣味驱动学习”的典范,推动技术知识的低门槛传播。
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。
评论
相关阅读
玩一玩系列——玩玩pg_mooncake(PostgreSQL的高性能列存新贵)
小满未满、
513次阅读
2025-03-03 17:18:03
王炸!OGG 23ai 终于支持从PostgreSQL备库抽取数据了
曹海峰
389次阅读
2025-03-09 12:54:06
玩一玩系列——玩玩login_hook(一款即将停止维护的PostgreSQL登录插件)
小满未满、
371次阅读
2025-03-08 18:19:28
明明想执行的SQL是DELETE、UPDATE,但为什么看到的是SELECT(FDW的实现原理解析)
小满未满、
348次阅读
2025-03-19 23:11:26
PostgreSQL初/中/高级认证考试(3.15)通过考生公示
开源软件联盟PostgreSQL分会
299次阅读
2025-03-20 09:50:36
IvorySQL 4.4 发布 - 基于 PostgreSQL 17.4,增强平台支持
通讯员
185次阅读
2025-03-20 15:31:04
套壳论
梧桐
180次阅读
2025-03-09 10:58:17
命名不规范,事后泪两行
xiongcc
170次阅读
2025-03-13 14:26:08
版本发布| IvorySQL 4.4 发布
IvorySQL开源数据库社区
110次阅读
2025-03-13 09:52:33
宝藏PEV,助力你成为SQL优化高手
xiongcc
102次阅读
2025-03-09 23:34:23