Notas y bibliotecas funcionando
This commit is contained in:
@@ -5,6 +5,7 @@ from src.ConexionSql.Base_conexion import ConexionBase
|
||||
from sqlalchemy import MetaData # Asegúrate de importar esto
|
||||
from src.TextManager.notas_mmr import generar_tabla_nota_para_biblioteca # Ajusta si es necesario
|
||||
from sqlalchemy import inspect
|
||||
from src.base import Base
|
||||
|
||||
|
||||
class Biblioteca:
|
||||
@@ -38,18 +39,21 @@ class Biblioteca:
|
||||
raise ValueError("Debes proporcionar un 'embedder' o un 'vector_dim' explícito.")
|
||||
|
||||
def generar_modelo_notas(self, conexion: ConexionBase):
|
||||
"""
|
||||
Genera dinámicamente un modelo de notas asociado a esta biblioteca y lo crea en la base de datos.
|
||||
Previene la creación si la tabla ya existe.
|
||||
"""
|
||||
nombre_tabla = f"{self.nombre}"
|
||||
print(f"[Notas] Generando tabla: {nombre_tabla}")
|
||||
|
||||
engine = conexion.get_engine()
|
||||
|
||||
inspector = inspect(engine)
|
||||
|
||||
if inspector.has_table(nombre_tabla):
|
||||
print(f"[Notas] ❌ Ya existe la tabla {nombre_tabla}")
|
||||
raise ValueError(f"Ya existe una tabla con el nombre '{nombre_tabla}' en la base de datos.")
|
||||
|
||||
metadata = MetaData()
|
||||
tabla, NotaModel = generar_tabla_nota_para_biblioteca(nombre_tabla, self.vector_dim, metadata)
|
||||
metadata.create_all(engine)
|
||||
print("[Notas] Generando definición SQL...")
|
||||
tabla, NotaModel = generar_tabla_nota_para_biblioteca(nombre_tabla, self.vector_dim, Base.metadata)
|
||||
|
||||
print("[Notas] Creando tabla en base de datos...")
|
||||
Base.metadata.create_all(engine)
|
||||
print("[Notas] ✔️ Tabla creada")
|
||||
|
||||
return NotaModel
|
||||
@@ -1,6 +1,6 @@
|
||||
import os
|
||||
from dotenv import load_dotenv
|
||||
from sqlalchemy import Column, String, Table, MetaData
|
||||
from sqlalchemy import Table, Column, String, Text, MetaData
|
||||
from pgvector.sqlalchemy import Vector
|
||||
from sqlalchemy.orm import registry, Session
|
||||
from src.TextManager.nota import Nota
|
||||
@@ -13,6 +13,9 @@ from src.ArquitectureLayer.Mapper import Mapper_base
|
||||
from src.ArquitectureLayer.Model import Model_base
|
||||
from src.ArquitectureLayer.Repo import Repo_base
|
||||
|
||||
|
||||
from src.base import Base # Este es tu declarative_base()
|
||||
|
||||
# ----------------------
|
||||
# Cargar .env
|
||||
# ----------------------
|
||||
@@ -28,47 +31,42 @@ mapper_registry = registry()
|
||||
# FUNCIONES AUXILIARES
|
||||
# ----------------------
|
||||
|
||||
|
||||
def generar_tabla_nota_para_biblioteca(biblioteca_nombre: str, vector_dim: int, metadata: MetaData) -> Tuple[Table, type]:
|
||||
"""
|
||||
Genera una tabla dinámica y modelo ORM para una biblioteca dada, con campos vectoriales.
|
||||
Genera una tabla dinámica y modelo ORM para una biblioteca dada, con campos vectoriales y campos del sistema.
|
||||
"""
|
||||
# Normalización robusta del nombre de la tabla
|
||||
nombre_tabla = re.sub(r"[^a-zA-Z0-9_]", "_", biblioteca_nombre.strip().lower())
|
||||
try:
|
||||
print(f"[INFO] Generando tabla para biblioteca: '{biblioteca_nombre}' con dimensión de vector: {vector_dim}")
|
||||
|
||||
tabla = Table(
|
||||
nombre_tabla,
|
||||
metadata,
|
||||
Column("id", String, primary_key=True),
|
||||
Column("titulo", String, nullable=False),
|
||||
Column("tags", String),
|
||||
Column("conexiones", String),
|
||||
Column("texto", String),
|
||||
Column("resumen", String),
|
||||
Column("vector", Vector(vector_dim), nullable=True),
|
||||
Column("vector_resumen", Vector(vector_dim), nullable=True),
|
||||
*Model_base.__table__.columns # Añade columnas del sistema si Model_base es declarativo
|
||||
)
|
||||
# Nombre SQL-safe
|
||||
nombre_tabla = re.sub(r"[^a-zA-Z0-9_]", "_", biblioteca_nombre.strip().lower())
|
||||
print(f"[DEBUG] Nombre de tabla SQL-safe: '{nombre_tabla}'")
|
||||
|
||||
class NotaModel(Model_base):
|
||||
"""
|
||||
Modelo ORM generado dinámicamente para notas de una biblioteca.
|
||||
"""
|
||||
def __init__(self, nota):
|
||||
self.id = nota.id
|
||||
self.titulo = nota.titulo
|
||||
self.tags = ",".join(nota.tags)
|
||||
self.conexiones = ",".join(nota.conexiones)
|
||||
self.texto = nota.texto
|
||||
self.resumen = nota.resumen
|
||||
self.vector = nota.vector
|
||||
self.vector_resumen = getattr(nota, "vector_resumen", None)
|
||||
# Modelo ORM dinámico
|
||||
class NotaModel(Base, Model_base):
|
||||
__tablename__ = nombre_tabla
|
||||
__table_args__ = {"extend_existing": True}
|
||||
|
||||
# Registrar solo si aún no se ha hecho
|
||||
if NotaModel.__name__ not in mapper_registry._class_registry:
|
||||
mapper_registry.map_imperatively(NotaModel, tabla)
|
||||
id = Column(String, primary_key=True)
|
||||
titulo = Column(String, nullable=False)
|
||||
tags = Column(String)
|
||||
conexiones = Column(String)
|
||||
texto = Column(Text)
|
||||
resumen = Column(Text)
|
||||
vector = Column(Vector(vector_dim), nullable=True)
|
||||
vector_resumen = Column(Vector(vector_dim), nullable=True)
|
||||
|
||||
return tabla, NotaModel
|
||||
print(f"[INFO] Modelo ORM 'NotaModel' creado para la tabla '{nombre_tabla}'")
|
||||
print(f"[DEBUG] Columnas del modelo: {[c.name for c in NotaModel.__table__.columns]}")
|
||||
print(f"[DEBUG] Tipos de columnas: {[str(c.type) for c in NotaModel.__table__.columns]}")
|
||||
print(f"[DEBUG] Claves primarias: {[c.name for c in NotaModel.__table__.primary_key]}")
|
||||
|
||||
return NotaModel.__table__, NotaModel
|
||||
|
||||
except Exception as e:
|
||||
print(f"[ERROR] Error al generar la tabla y modelo ORM para '{biblioteca_nombre}': {e}")
|
||||
raise
|
||||
|
||||
# ----------------------
|
||||
# MAPPER
|
||||
|
||||
Reference in New Issue
Block a user