ForeignKey & JOINs
ForeignKey & JOINs
Sección titulada «ForeignKey & JOINs»PyGo proporciona manejo automático de relaciones de clave foránea con generación de JOINs en tiempo de compilación. Las claves foráneas se definen en el DSL .pgo y el transpiler genera código Python y Go idiomático con soporte SQL JOIN apropiado.
Definir Relaciones
Sección titulada «Definir Relaciones»Uno-a-Muchos (ForeignKey)
Sección titulada «Uno-a-Muchos (ForeignKey)»model Author: id: UUID name: String email: Email
model Post: title: String content: String author: ForeignKey[User] author_id: UUIDDeclaración Explícita de Foreign Key
Sección titulada «Declaración Explícita de Foreign Key»foreignKey user_id -> UserEsto genera un método get_user() que obtiene el User relacionado.
Código Generado
Sección titulada «Código Generado»Python (gen_py.py)
Sección titulada «Python (gen_py.py)»class Post(BaseModel): title: str content: str author_id: str author: User # Campo ForeignKey
def get_user(self) -> User: return User.find(self.author_id)Go (gen_go.go)
Sección titulada «Go (gen_go.go)»type Post struct { Title string Content string AuthorID string Author User}
func (p *Post) GetUser() *User { return UserFind(p.AuthorID)}Consultas con JOINs
Sección titulada «Consultas con JOINs»PyGo genera automáticamente consultas JOIN cuando accedes a modelos relacionados:
# Obtener el autor de un post (consulta única, JOIN)post = Post.find(id)author = post.get_user()Opciones de Foreign Key
Sección titulada «Opciones de Foreign Key»Eliminación en Cadena (CASCADE)
Sección titulada «Eliminación en Cadena (CASCADE)»model Post: title: String user: ForeignKey[User] # Por defecto: protectMúltiples Foreign Keys
Sección titulada «Múltiples Foreign Keys»model Comment: content: String author_id: UUID post_id: UUID author: ForeignKey[User] post: ForeignKey[Post]Relaciones Muchos-a-Muchos
Sección titulada «Relaciones Muchos-a-Muchos»model Tag: name: String
model Article: title: String content: String tags: Array[Tag]Relaciones Inversas
Sección titulada «Relaciones Inversas»Accede a relaciones inversas automáticamente:
author = Author.find(id)# Obtener todos los posts de este autorposts = Post.filter(author_id=author.id)Esquema de Base de Datos
Sección titulada «Esquema de Base de Datos»CREATE TABLE author ( id UUID PRIMARY KEY, name TEXT NOT NULL, email TEXT NOT NULL);
CREATE TABLE post ( id INTEGER PRIMARY KEY, title TEXT NOT NULL, content TEXT NOT NULL, author_id UUID NOT NULL, FOREIGN KEY (author_id) REFERENCES author(id) ON DELETE CASCADE);Consideraciones de Rendimiento
Sección titulada «Consideraciones de Rendimiento»- Usa
filter()con campos de clave foránea para búsquedas indexadas - Los JOINs se generan automáticamente al usar métodos
get_<relación>() - Considera desnormalización para relaciones accedidas frecuentemente