Загрузка данных


import duckdb
from sqlmodel import Session, select, create_engine, SQLModel, Field
from typing import Optional

class NetflixContent(SQLModel, table=True):
    id: Optional[int] = Field(default=None, primary_key=True)
    type: str
    title: str
    director: Optional[str] = None
    cast: Optional[str] = None
    country: Optional[str] = None
    date_added: Optional[str] = None
    release_year: int
    rating: Optional[str] = None
    duration_value: Optional[int] = None
    duration_unit: Optional[str] = None
    listed_in: str
    description: str

sqlite_url = "sqlite:///netflix_data.db"
engine = create_engine(sqlite_url)

def init_database(csv_file_path: str):
    #! СОЗДАЕМ ПУСТУЮ БАЗУ ДАННЫХ
    SQLModel.metadata.create_all(engine)
    #! ПОДКЛЮЧАЕМ DUCKDB ДЛЯ РАБОТЫ С CSV ФАЙЛОМ
    con = duckdb.connect()
    
    #! ГОВОРИМ DUCKDB КАК НУЖНО СОХРАНЯТЬ ДАННЫЕ ВНУТРИ CSV ФАЙЛА
    query = f"""
    SELECT 
        trim(show_id),
        trim(type),
        trim(title),
        trim(director),
        trim("cast"),
        trim(country),
        trim(date_added),
        CAST(release_year AS INTEGER),
        trim(rating),
        -- Вытаскиваем число (90)
        CAST(regexp_extract(duration, '(\\d+)') AS INTEGER),
        -- Вытаскиваем тип (min / Seasons)
        regexp_extract(duration, '([a-zA-Z]+)'),
        trim(listed_in),
        trim(description)
    FROM read_csv_auto('{csv_file_path}')
    """

    
    # Выполняем запрос и получаем список кортежей
    raw_data = con.execute(query).fetchall()
    
    # Записываем данные в SQLite через сессию SQLModel
    with Session(engine) as session:
        #! проверка не заполненная ли у тебя база данных
        existing_count = session.exec(select(NetflixContent)).first()
        if existing_count:
            print("База уже содержит данные. Пропускаю импорт.")
            return

        for row in raw_data:
            item = NetflixContent(
                show_id=row[0],
                type=row[1],
                title=row[2],
                director=row[3],
                cast=row[4],
                country=row[5],
                date_added=row[6],
                release_year=row[7],
                rating=row[8],
                duration_value=row[9],
                duration_unit=row[10],
                listed_in=row[11],
                description=row[12]
            )
            session.add(item)
        
        session.commit()
        print(f"Успешно импортировано {len(raw_data)} записей.")

# 2. ПРИМЕР ИСПОЛЬЗОВАНИЯ СИСТЕМЫ
if __name__ == "__main__":
    # Замени 'image_860e3d.csv' на реальное имя твоего файла
    # Если это скриншот из Excel, сохрани таблицу в CSV формат.
    file_path = "netflix_titles.csv" 
    
    try:
        # Собираем систему
        init_database(file_path)
        
        # Делаем запросы через SQLModel
        with Session(engine) as session:
            # Пример: Найти 5 самых свежих сериалов (TV Show)
            statement = select(NetflixContent).where(
                NetflixContent.country == "United States" and NetflixContent.country == "India",
                NetflixContent.type == "Movie" 
            ).order_by(NetflixContent.release_year.desc())
            
            results = session.exec(statement).all()
            
            print("\n--- Последние добавленные сериалы ---")
            for show in results:
                print(f"[{show.release_year} | {show.country}] {show.title} - {show.duration_value} {show.duration_unit}")
                
    except Exception as e:
        print(f"Ошибка: {e}")
        
        
#! https://www.kaggle.com/datasets/rohitsahoo/sales-forecasting
#! https://www.kaggle.com/datasets/gregorut/videogamesales 
#! https://www.kaggle.com/datasets/carrie1/ecommerce-data