Ir al contenido

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.

model Author:
id: UUID
name: String
email: Email
model Post:
title: String
content: String
author: ForeignKey[User]
author_id: UUID
foreignKey user_id -> User

Esto genera un método get_user() que obtiene el User relacionado.

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)
type Post struct {
Title string
Content string
AuthorID string
Author User
}
func (p *Post) GetUser() *User {
return UserFind(p.AuthorID)
}

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()
model Post:
title: String
user: ForeignKey[User] # Por defecto: protect
model Comment:
content: String
author_id: UUID
post_id: UUID
author: ForeignKey[User]
post: ForeignKey[Post]
model Tag:
name: String
model Article:
title: String
content: String
tags: Array[Tag]

Accede a relaciones inversas automáticamente:

author = Author.find(id)
# Obtener todos los posts de este autor
posts = Post.filter(author_id=author.id)
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
);
  • 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