当前位置: 首页 > news >正文

PostgreSQL用SQL实现俄罗斯方块

📢📢📢📣📣📣
作者:IT邦德
中国DBA联盟(ACDU)成员,10余年DBA工作经验
Oracle、PostgreSQL ACE
CSDN博客专家及B站知名UP主,全网粉丝10万+
擅长主流Oracle、MySQL、PG、高斯及Greenplum备份恢复,
安装迁移,性能优化、故障应急处理

文章目录

    • 1.游戏安装
    • 2.游戏使用
    • 3.PL/pgSQL能做什么?
      • 3.1 敏感数据自动加密
        • 3.2 定时数据清理
      • 2.3 大数据迁移与转换
      • 2.4 与Linux交互备份表
    • 总结

基于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可扩展至游戏开发、模拟仿真等领域,成为“趣味驱动学习”的典范,推动技术知识的低门槛传播。

相关文章:

  • EasyRTC轻量级Webrtc音视频通话SDK,助力带屏IPC在嵌入式设备中的应用
  • 密码协议与网络安全——引言
  • UE5.5 Niagara 渲染器
  • 从 0 到 1 构建 Python 分布式爬虫,实现搜索引擎全攻略
  • 简述Mybatis的插件运行原理,以及如何编写一个插件?
  • 【Ratis】Ratis Streaming概览
  • win11找不到hosts文件该如何处理
  • 学习笔记:黑马程序员JavaWeb开发教程(2025.3.21)
  • 以欧洲极端降水归因分析为例讲解CESM模型在降水诊断计算中的科研应用
  • 性能优化中如何“避免链接关键请求”
  • Upwork合同类型:固定价格 vs 按小时收费
  • AI Agent中的MCP详解
  • 回溯法经典练习:组合总和的深度解析与实战
  • 夸克网盘任务脚本——进阶自动版
  • Axure项目实战:智慧城市APP(一)(动态面板、拖动效果)
  • tcping 命令的使用,ping IP 和端口
  • LDAP从入门到实战:环境部署与配置指南(下)
  • LangManus:新一代开源智能体框架如何让AI开发更简单?
  • 根据文件名称查询文件所在位置
  • “智改数转”新风口,物联网如何重构制造业竞争力?
  • 马上评|提供情绪价值,也是文旅经济的软实力
  • 海外考古大家访谈|斯文特·帕波:人类进化遗传学的奠基者
  • 商务部新闻发言人就中美经贸对话磋商情况答记者问
  • 全球最大汽车板供应商宝钢股份:汽车工业加速转型中材料商如何共舞?
  • 夜读丨跷脚牛肉乐翘脚
  • 龚正会见委内瑞拉副总统罗德里格斯