Spaces:
Sleeping
Sleeping
File size: 6,163 Bytes
ac40033 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 |
from sqlalchemy import create_engine, Column, Integer, String, Float, Boolean, DateTime, ForeignKey
from sqlalchemy.orm import sessionmaker, relationship, declarative_base
from pydantic import BaseModel, ConfigDict
from typing import List
from datetime import datetime
# ایجاد مدلهای SQLAlchemy
Base = declarative_base()
class Annotator(Base):
__tablename__ = 'annotators'
id = Column(Integer, primary_key=True)
name = Column(String, nullable=False, unique=True)
password = Column(String, nullable=False)
last_login = Column(DateTime)
is_active = Column(Boolean, default=True)
annotations = relationship('Annotation', backref='annotator')
class AudioTrim(Base):
__tablename__ = 'audio_trims'
id = Column(Integer, primary_key=True)
start = Column(Float, nullable=False)
end = Column(Float, nullable=False)
annotation_id = Column(Integer, ForeignKey('annotations.id'))
class Annotation(Base):
__tablename__ = 'annotations'
id = Column(Integer, primary_key=True)
annotated_subtitle = Column(String, nullable=False)
is_first_phase_accepted = Column(Boolean, nullable=False)
create_at = Column(DateTime, nullable=False)
update_at = Column(DateTime, nullable=False)
audio_trims = relationship('AudioTrim', cascade='all, delete', backref='annotation')
json_data_id = Column(Integer, ForeignKey('json_data.id'))
annotator_id = Column(Integer, ForeignKey('annotators.id'))
class JsonData(Base):
__tablename__ = 'json_data'
id = Column(Integer, primary_key=True)
voice_name = Column(String, nullable=False)
original_subtitle = Column(String, nullable=False)
ignore_it = Column(Boolean, nullable=False)
is_approved_in_second_phase = Column(Boolean, nullable=False)
annotations = relationship('Annotation', cascade='all, delete', backref='json_data')
# ایجاد مدلهای Pydantic
class AudioTrimModel(BaseModel):
start: float
end: float
model_config = ConfigDict(from_attributes=True)
class AnnotationModel(BaseModel):
annotator: str
annotated_subtitle: str
is_first_phase_accepted: bool
create_at: datetime
update_at: datetime
audio_trims: List[AudioTrimModel]
model_config = ConfigDict(from_attributes=True)
class JsonDataModel(BaseModel):
id: int
voice_name: str
original_subtitle: str
ignore_it: bool
is_approved_in_second_phase: bool
annotations: List[AnnotationModel]
model_config = ConfigDict(from_attributes=True)
# ایجاد جلسه
DB_URL = "mysql+pymysql://user:password@localhost/testdb" # اطلاعات کاربری و دیتابیس را ویرایش کنید
engine = create_engine(DB_URL)
SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)
def initialize_database():
Base.metadata.create_all(bind=engine)
# تابع ذخیره دادهها در دیتابیس
def save_json_data(json_data_dict):
db = SessionLocal()
try:
# استفاده از Pydantic برای اعتبارسنجی دادهها
json_data = JsonDataModel(**json_data_dict)
for annotation in json_data.annotations:
# تامین موجودیت annotator
db_annotator = db.query(Annotator).filter_by(name=annotation.annotator).first()
if not db_annotator:
db_annotator = Annotator(name=annotation.annotator, password="default_password")
db.add(db_annotator)
db.commit() # اضافه کنید تا id اختصاص داده شود
# تبدیل مدل Pydantic به مدل SQLAlchemy
db_annotation = Annotation(
annotated_subtitle=annotation.annotated_subtitle,
is_first_phase_accepted=annotation.is_first_phase_accepted,
create_at=annotation.create_at,
update_at=annotation.update_at,
audio_trims=[
AudioTrim(start=trim.start, end=trim.end) for trim in annotation.audio_trims
],
annotator=db_annotator
)
db_json_data = JsonData(
id=json_data.id,
voice_name=json_data.voice_name,
original_subtitle=json_data.original_subtitle,
ignore_it=json_data.ignore_it,
is_approved_in_second_phase=json_data.is_approved_in_second_phase,
annotations=[db_annotation]
)
db.add(db_json_data)
db.commit()
except Exception as e:
db.rollback()
print(e)
finally:
db.close()
# فراخوانی تابع ایجاد جدولها و افزودن داده
initialize_database()
# دادهی نمونه برای افزودن
json_data = {
"id": 16562,
"voice_name": "voice1.wav",
"original_subtitle": "خلاصه با دلی ناراحت این کار رو کرد کاری رو که به نظرم میاد کار عقلانی بوده و رفتن رسیدن همون جایی که خاطره خداحافظی ۶ سال پیش رو واسه شکلتون زنده کرد اون بار به عنوان invalid اون بار به عنوان ادمی که از پس کار برنیومده",
"ignore_it": False,
"annotations": [
{
"annotator": "amin76",
"annotated_subtitle": "خلاصه با دلی ناراحت این کار رو کرد کاری رو که به نظرم میاد کار عقلانی بوده و رفتن رسیدن همون جایی که خاطره خداحافظی شش سال پیش رو واسه شکلتون زنده کرد اون بار به عنوان اينوليد اون بار به عنوان آدمی که از پس کار برنیومده",
"audio_trims": [
{"start": 14.5, "end": 15.0},
{"start": 14.3, "end": 15.0}
],
"is_first_phase_accepted": False,
"create_at": "2025-05-20T16:05:53.138811",
"update_at": "2025-05-20T16:06:28.525393"
}
],
"is_approved_in_second_phase": False
}
save_json_data(json_data) |