Spaces:
Sleeping
Sleeping
File size: 2,250 Bytes
a5962a6 c115b81 a5962a6 5b0bb4b a5962a6 5b0bb4b a5962a6 c115b81 a5962a6 c115b81 a5962a6 c115b81 a5962a6 c115b81 a5962a6 c115b81 a5962a6 c115b81 a5962a6 c115b81 a5962a6 c115b81 a5962a6 c115b81 a5962a6 c115b81 a5962a6 c115b81 a5962a6 |
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 |
# database.py
# Define los modelos de la base de datos (SQLAlchemy ORM) y la lógica de sesión.
import os
from sqlalchemy import create_engine, Column, Integer, String, DateTime, Boolean, ForeignKey
from sqlalchemy.orm import sessionmaker, relationship
from sqlalchemy.ext.declarative import declarative_base
from datetime import datetime
# --- Configuración de la Base de Datos ---
# En un entorno de solo lectura, DEBEMOS escribir en el único directorio escribible: /tmp
DATA_DIR = "/tmp/data" # RUTA ABSOLUTA a un directorio escribible.
if not os.path.exists(DATA_DIR):
# Esto ahora intentará crear el directorio en /tmp/data, que sí tiene permisos.
os.makedirs(DATA_DIR)
DATABASE_URL = f"sqlite:///{DATA_DIR}/samuel.db"
# El engine es el punto de entrada a la base de datos.
# connect_args es necesario para SQLite para permitir su uso en múltiples hilos (como en FastAPI).
engine = create_engine(
DATABASE_URL, connect_args={"check_same_thread": False}
)
# SessionLocal es una fábrica de sesiones de base de datos.
SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)
# Base es una clase base para nuestros modelos ORM.
Base = declarative_base()
# --- Modelos de Datos ORM ---
class User(Base):
__tablename__ = "users"
id = Column(Integer, primary_key=True, index=True)
email = Column(String, unique=True, index=True, nullable=False)
hashed_password = Column(String, nullable=False)
has_completed_initiation = Column(Boolean, default=False)
memories = relationship("Memory", back_populates="owner")
class Memory(Base):
__tablename__ = "memories"
id = Column(Integer, primary_key=True, index=True)
content = Column(String, nullable=False)
timestamp = Column(DateTime, default=datetime.utcnow)
user_id = Column(Integer, ForeignKey("users.id"))
owner = relationship("User", back_populates="memories")
# --- Funciones de Ayuda ---
def create_db_and_tables():
"""Crea todas las tablas en la base de datos si no existen."""
Base.metadata.create_all(bind=engine)
def get_db():
"""Generador de dependencia de FastAPI para obtener una sesión de DB."""
db = SessionLocal()
try:
yield db
finally:
db.close()
|