add_token_rate_limit_fields.sql 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149
  1. -- ====================================================================
  2. -- Token访问频率限制功能数据库迁移脚本
  3. -- ====================================================================
  4. -- 版本: v1.0
  5. -- 创建日期: 2025-08-25
  6. -- 描述: 为tokens表添加访问频率限制功能的相关字段
  7. --
  8. -- 新增字段:
  9. -- - rate_limit_per_minute: 每分钟访问次数限制,0表示不限制
  10. -- - rate_limit_per_day: 每日访问次数限制,0表示不限制
  11. -- - last_rate_limit_reset: 最后重置时间,用于重置计数器
  12. -- ====================================================================
  13. -- ====================================================================
  14. -- 向前迁移 (UP) - 添加字段
  15. -- ====================================================================
  16. -- MySQL 数据库
  17. -- 检查字段是否已存在,避免重复添加
  18. SET @sql_rate_minute = 'ALTER TABLE tokens ADD COLUMN rate_limit_per_minute INT NOT NULL DEFAULT 0 COMMENT ''每分钟访问次数限制,0表示不限制''';
  19. SET @sql_rate_day = 'ALTER TABLE tokens ADD COLUMN rate_limit_per_day INT NOT NULL DEFAULT 0 COMMENT ''每日访问次数限制,0表示不限制''';
  20. SET @sql_reset_time = 'ALTER TABLE tokens ADD COLUMN last_rate_limit_reset BIGINT NOT NULL DEFAULT 0 COMMENT ''最后重置时间戳''';
  21. -- 执行添加字段的SQL (仅在字段不存在时执行)
  22. PREPARE stmt FROM @sql_rate_minute;
  23. EXECUTE stmt;
  24. DEALLOCATE PREPARE stmt;
  25. PREPARE stmt FROM @sql_rate_day;
  26. EXECUTE stmt;
  27. DEALLOCATE PREPARE stmt;
  28. PREPARE stmt FROM @sql_reset_time;
  29. EXECUTE stmt;
  30. DEALLOCATE PREPARE stmt;
  31. -- 为新字段添加索引 (可选,提升查询性能)
  32. -- CREATE INDEX idx_tokens_rate_limit_reset ON tokens(last_rate_limit_reset);
  33. -- ====================================================================
  34. -- PostgreSQL 数据库 (如果使用PostgreSQL,取消下面注释)
  35. -- ====================================================================
  36. /*
  37. -- 添加字段
  38. ALTER TABLE tokens ADD COLUMN IF NOT EXISTS rate_limit_per_minute INTEGER NOT NULL DEFAULT 0;
  39. ALTER TABLE tokens ADD COLUMN IF NOT EXISTS rate_limit_per_day INTEGER NOT NULL DEFAULT 0;
  40. ALTER TABLE tokens ADD COLUMN IF NOT EXISTS last_rate_limit_reset BIGINT NOT NULL DEFAULT 0;
  41. -- 添加注释
  42. COMMENT ON COLUMN tokens.rate_limit_per_minute IS '每分钟访问次数限制,0表示不限制';
  43. COMMENT ON COLUMN tokens.rate_limit_per_day IS '每日访问次数限制,0表示不限制';
  44. COMMENT ON COLUMN tokens.last_rate_limit_reset IS '最后重置时间戳';
  45. -- 添加索引 (可选)
  46. -- CREATE INDEX IF NOT EXISTS idx_tokens_rate_limit_reset ON tokens(last_rate_limit_reset);
  47. */
  48. -- ====================================================================
  49. -- SQLite 数据库 (如果使用SQLite,取消下面注释)
  50. -- ====================================================================
  51. /*
  52. -- SQLite不支持IF NOT EXISTS语法,需要手动检查
  53. -- 添加字段
  54. ALTER TABLE tokens ADD COLUMN rate_limit_per_minute INTEGER NOT NULL DEFAULT 0;
  55. ALTER TABLE tokens ADD COLUMN rate_limit_per_day INTEGER NOT NULL DEFAULT 0;
  56. ALTER TABLE tokens ADD COLUMN last_rate_limit_reset INTEGER NOT NULL DEFAULT 0;
  57. -- 添加索引 (可选)
  58. -- CREATE INDEX IF NOT EXISTS idx_tokens_rate_limit_reset ON tokens(last_rate_limit_reset);
  59. */
  60. -- ====================================================================
  61. -- 向后迁移 (DOWN) - 删除字段 (回滚操作)
  62. -- ====================================================================
  63. /*
  64. -- 如果需要回滚,请执行以下SQL语句
  65. -- MySQL 回滚
  66. ALTER TABLE tokens DROP COLUMN IF EXISTS rate_limit_per_minute;
  67. ALTER TABLE tokens DROP COLUMN IF EXISTS rate_limit_per_day;
  68. ALTER TABLE tokens DROP COLUMN IF EXISTS last_rate_limit_reset;
  69. -- PostgreSQL 回滚
  70. -- ALTER TABLE tokens DROP COLUMN IF EXISTS rate_limit_per_minute;
  71. -- ALTER TABLE tokens DROP COLUMN IF EXISTS rate_limit_per_day;
  72. -- ALTER TABLE tokens DROP COLUMN IF EXISTS last_rate_limit_reset;
  73. -- SQLite 回滚
  74. -- SQLite不支持DROP COLUMN,需要重建表:
  75. -- 1. 创建临时表包含原有字段
  76. -- CREATE TABLE tokens_temp AS
  77. -- SELECT id, user_id, key, status, name, created_time, accessed_time,
  78. -- expired_time, remain_quota, unlimited_quota, model_limits_enabled,
  79. -- model_limits, allow_ips, used_quota, `group`, deleted_at,
  80. -- daily_usage_count, total_usage_count, last_usage_date
  81. -- FROM tokens;
  82. -- 2. 删除原表
  83. -- DROP TABLE tokens;
  84. -- 3. 重命名临时表
  85. -- ALTER TABLE tokens_temp RENAME TO tokens;
  86. -- 4. 重建索引和约束 (根据实际情况调整)
  87. */
  88. -- ====================================================================
  89. -- 验证脚本 - 检查字段是否成功添加
  90. -- ====================================================================
  91. /*
  92. -- 检查字段是否存在 (MySQL)
  93. SELECT
  94. COLUMN_NAME,
  95. DATA_TYPE,
  96. IS_NULLABLE,
  97. COLUMN_DEFAULT,
  98. COLUMN_COMMENT
  99. FROM INFORMATION_SCHEMA.COLUMNS
  100. WHERE TABLE_SCHEMA = DATABASE()
  101. AND TABLE_NAME = 'tokens'
  102. AND COLUMN_NAME IN ('rate_limit_per_minute', 'rate_limit_per_day', 'last_rate_limit_reset');
  103. -- 检查字段是否存在 (PostgreSQL)
  104. -- SELECT column_name, data_type, is_nullable, column_default
  105. -- FROM information_schema.columns
  106. -- WHERE table_name = 'tokens'
  107. -- AND column_name IN ('rate_limit_per_minute', 'rate_limit_per_day', 'last_rate_limit_reset');
  108. -- 检查字段是否存在 (SQLite)
  109. -- PRAGMA table_info(tokens);
  110. */
  111. -- ====================================================================
  112. -- 使用说明
  113. -- ====================================================================
  114. /*
  115. 1. 根据您的数据库类型,选择对应的SQL语句执行
  116. 2. 默认启用MySQL语法,如使用其他数据库请取消相应注释
  117. 3. 建议在执行前备份数据库
  118. 4. 执行后可运行验证脚本确认字段添加成功
  119. 5. 如需回滚,请执行"向后迁移"部分的SQL语句
  120. 新字段说明:
  121. - rate_limit_per_minute: 每分钟访问次数限制,0表示不限制
  122. - rate_limit_per_day: 每日访问次数限制,0表示不限制
  123. - last_rate_limit_reset: 最后重置时间戳,用于计算是否需要重置计数器
  124. 这些字段会在Token验证时被检查,实现访问频率限制功能。
  125. */