db.py 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. import pymysql
  2. from .config import settings
  3. def get_connection():
  4. return pymysql.connect(
  5. host=settings.db_host,
  6. port=settings.db_port,
  7. user=settings.db_user,
  8. password=settings.db_password,
  9. database=settings.db_name,
  10. charset="utf8mb4",
  11. cursorclass=pymysql.cursors.DictCursor,
  12. connect_timeout=settings.db_connect_timeout,
  13. read_timeout=30,
  14. write_timeout=30,
  15. autocommit=True,
  16. )
  17. _ANNOTATION_TABLE_DDL = """
  18. CREATE TABLE IF NOT EXISTS wave_annotation (
  19. id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '标注ID',
  20. wave_file_id BIGINT UNSIGNED NOT NULL COMMENT '所属波形文件ID(wave_file.id)',
  21. label VARCHAR(8) NOT NULL COMMENT '样本类型:正常 / 异常',
  22. period_start INT NOT NULL COMMENT '起始周期编号',
  23. period_end INT NOT NULL COMMENT '结束周期编号(含)',
  24. sample_index_start INT NOT NULL COMMENT '起始采样点索引',
  25. sample_index_end INT NOT NULL COMMENT '结束采样点索引(含)',
  26. created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  27. updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  28. PRIMARY KEY (id),
  29. KEY idx_wave_file (wave_file_id)
  30. ) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COMMENT = '波形标注索引表';
  31. """
  32. def ensure_annotation_table() -> None:
  33. with get_connection() as connection:
  34. with connection.cursor() as cursor:
  35. cursor.execute(_ANNOTATION_TABLE_DDL)
  36. _LABEL_TABLE_DDL = """
  37. CREATE TABLE IF NOT EXISTS compressor_label (
  38. id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '标签ID',
  39. source_type VARCHAR(32) NOT NULL COMMENT 'vibration/oil_pressure/temperature/pressure_wave/pks_manual',
  40. origin VARCHAR(16) NOT NULL DEFAULT 'manual' COMMENT 'algorithm/manual/imported',
  41. target_type VARCHAR(16) NOT NULL COMMENT 'wave_file/pks',
  42. target_id BIGINT UNSIGNED NULL COMMENT 'wave_file.id',
  43. target_key VARCHAR(200) NOT NULL COMMENT '通道+目标标识',
  44. channel_key VARCHAR(200) NOT NULL COMMENT '子图通道键',
  45. segment_key VARCHAR(64) NULL COMMENT '算法原始段分组键',
  46. unit VARCHAR(16) NOT NULL COMMENT '机组号,如 7',
  47. device_code VARCHAR(64) NULL COMMENT '如 7#',
  48. device_part VARCHAR(200) NULL COMMENT '如 7号机组一缸 / 7号机',
  49. device_point VARCHAR(200) NULL COMMENT 'wave 点位或 PKS 指标名',
  50. metric_key VARCHAR(64) NULL COMMENT 'PKS 列名,如 YSJ_11',
  51. metric_label VARCHAR(200) NULL COMMENT 'PKS 指标中文名',
  52. start_time DATETIME NOT NULL COMMENT '标签段起点',
  53. end_time DATETIME NOT NULL COMMENT '标签段终点(不含)',
  54. algorithm_start DATETIME NULL COMMENT '算法原始段起点',
  55. algorithm_end DATETIME NULL COMMENT '算法原始段终点',
  56. label_type VARCHAR(32) NOT NULL COMMENT '轻微/异常/严重异常',
  57. label_subtype VARCHAR(64) NULL COMMENT '振动侧/温度部位/方向等',
  58. severity TINYINT NULL COMMENT '1轻微/2异常/3严重异常',
  59. confirm_status VARCHAR(16) NOT NULL DEFAULT '未确认' COMMENT '未确认/已确认/人工否决',
  60. usable_for_train TINYINT(1) NOT NULL DEFAULT 1,
  61. source_file VARCHAR(500) NULL,
  62. source_row VARCHAR(64) NULL COMMENT '周期编号等',
  63. algorithm_version VARCHAR(64) NULL,
  64. features_json MEDIUMTEXT NULL COMMENT '算法原始属性',
  65. note VARCHAR(1000) NULL,
  66. created_by VARCHAR(64) NULL,
  67. updated_by VARCHAR(64) NULL,
  68. created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
  69. updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  70. deleted_at DATETIME NULL,
  71. PRIMARY KEY (id),
  72. UNIQUE KEY uk_segment (segment_key),
  73. KEY idx_target_time (target_key, start_time, end_time),
  74. KEY idx_channel_time (channel_key, start_time),
  75. KEY idx_unit_time (unit, start_time),
  76. KEY idx_source (source_type, origin)
  77. ) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COMMENT = '统一训练标签表';
  78. """
  79. def ensure_label_table() -> None:
  80. with get_connection() as connection:
  81. with connection.cursor() as cursor:
  82. cursor.execute(_LABEL_TABLE_DDL)