utils.py 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. from sqlalchemy.ext.declarative import declarative_base
  2. from sqlalchemy import Column, Integer, String, Float, DateTime
  3. from sqlalchemy import create_engine
  4. import uuid
  5. from datetime import datetime, timezone
  6. Base = declarative_base()
  7. def create_dynamic_table(dataset_id, columns):
  8. """动态创建数据表"""
  9. # 动态构建列
  10. dynamic_columns = {
  11. 'id': Column(Integer, primary_key=True, autoincrement=True) # 为每个表添加一个主键
  12. }
  13. # 根据 columns 字典动态创建字段
  14. for col_name, col_type in columns.items():
  15. if col_type == 'str':
  16. dynamic_columns[col_name] = Column(String(255))
  17. elif col_type == 'int':
  18. dynamic_columns[col_name] = Column(Integer)
  19. elif col_type == 'float':
  20. dynamic_columns[col_name] = Column(Float)
  21. elif col_type == 'datetime':
  22. dynamic_columns[col_name] = Column(DateTime)
  23. # 动态生成模型类,表名使用 dataset_{dataset_id}
  24. table_name = f"dataset_{dataset_id}"
  25. # 在生成的类中添加 `__tablename__`
  26. dynamic_columns['__tablename__'] = table_name
  27. # 动态创建类
  28. dynamic_class = type(table_name, (Base,), dynamic_columns)
  29. # 打印调试信息
  30. print("table_name:", table_name)
  31. print("dynamic_columns:", dynamic_columns)
  32. # 创建数据库引擎
  33. engine = create_engine('sqlite:///SoilAcidification.db') # 这里需要替换为你的数据库引擎
  34. Base.metadata.create_all(engine) # 创建所有表格
  35. return dynamic_class
  36. # 判断文件类型是否允许
  37. def allowed_file(filename):
  38. ALLOWED_EXTENSIONS = {'xlsx', 'xls'}
  39. return '.' in filename and filename.rsplit('.', 1)[1].lower() in ALLOWED_EXTENSIONS
  40. # 生成唯一文件名
  41. def generate_unique_filename(filename):
  42. # 获取文件的扩展名
  43. ext = filename.rsplit('.', 1)[1].lower()
  44. # 使用 UUID 和当前时间戳生成唯一文件名(使用 UTC 时区)
  45. unique_filename = f"{uuid.uuid4().hex}_{datetime.now(timezone.utc).strftime('%Y%m%d%H%M%S')}.{ext}"
  46. return unique_filename