python - instalar - sqlalchemy query
¿Cómo funcionan las relaciones simples de SQLAlchemy? (1)
No soy un experto en bases de datos, solo sé lo básico, realmente. Recogí SQLAlchemy para un proyecto pequeño, y estoy usando la configuración de base declarativa en lugar de la forma "normal". De esta manera parece mucho más simple.
Sin embargo, al configurar mi esquema de base de datos, me di cuenta de que no entendía algunos conceptos de relación con la base de datos.
Si tuviera una relación muchos a uno antes, por ejemplo, artículos de autores (donde cada artículo podría ser escrito por un solo autor), pondría un campo author_id
en mi columna de articles
. Pero SQLAlchemy tiene este objeto ForeignKey y una función de relación con un kwarg de respaldo, y no tengo idea de lo que SIGNIFICA.
Tengo miedo de descubrir cómo es una relación de muchos a muchos con una tabla intermedia (cuando necesito datos adicionales sobre cada relación).
¿Alguien puede desmitificar esto para mí? En este momento estoy configurando para permitir la autenticación de openID para mi aplicación. Así que tengo esto:
from __init__ import Base
from sqlalchemy.schema import Column
from sqlalchemy.types import Integer, String
class Users(Base):
__tablename__ = ''users''
id = Column(Integer, primary_key=True)
username = Column(String, unique=True)
email = Column(String)
password = Column(String)
salt = Column(String)
class OpenID(Base):
__tablename__ = ''openid''
url = Column(String, primary_key=True)
user_id = #?
Creo que el ?
debe ser reemplazado por Column(Integer, ForeignKey(''users.id''))
, pero no estoy seguro, y necesito poner openids = relationship("OpenID", backref="users")
en la clase Users ? ¿Por qué? ¿Qué hace? ¿Qué es un backref?
Sí, necesita user_id = Column(Integer, ForeignKey(''users.id''))
o user_id = Column(Integer, ForeignKey(''users.id''), nullable=False)
si es obligatorio. Esto se traduce directamente a FOREIGN KEY en el esquema subyacente de la base de datos, sin magia.
La forma más simple de declarar una relación es user = relationship(Users)
en la clase OpenID
. También puede usar users = relationship(''OpenID'')
en la clase Users
. backref
parámetro backref
permite declarar ambas relaciones con declaración única: significa instalar automáticamente una relación inversa en la clase relacionada. Yo personalmente prefiero usar backref
-s solo para relaciones autorreferentes. La razón es que me gusta el código auto-documentado: cuando miras a través de su definición, ves todas las propiedades definidas, mientras que con el backref
necesitas mirar a través de otras clases (probablemente definidas en otros módulos).