tutorial quick in_ guide example español create python sqlalchemy pyramid

python - quick - sqlalchemy select example



Cómo crear una referencia de clave externa con sqlalchemy (1)

Hola, no puedo entender cómo hacer una referencia de clave externa usando sqlalchemy. Creé un nuevo cliente de tabla en mi base de datos:

class Client(DeclarativeBase): __tablename__ = ''client'' id = Column(Integer, primary_key=True) user_id = Column( Integer, ForeignKey(''user.id'', ondelete=''CASCADE''), nullable=False, index=True, ) orgname = Column(Unicode, nullable=False) def __init__(self, **kwargs): super(Client, self).__init__(**kwargs)

No estoy tratando de hacer algo como esto

u = User(user_name=u''dusual'') session.add(u) c = Client(user=u, orgname="dummy_org") session.add(c)

Pero sqlalchemy grita diciendo:

(k, cls_. nombre )) TypeError: ''user'' es un argumento de palabra clave no válido para el cliente

Ahora bien, si esto no fuera obvio, debería permitirse al usuario como argumento de palabra clave cómo puedo asegurarme de que mi tabla pueda tomar el argumento de la palabra clave del usuario.


Debe definir una relación entre los modelos de User y Client :

de la relación de importación sqlalchemy.orm

class Client(DeclarativeBase): __tablename__ = ''client'' id = Column(Integer, primary_key=True) user_id = Column( Integer, ForeignKey(''user.id'', ondelete=''CASCADE''), nullable=False, # no need to add index=True, all FKs have indexes ) user = relationship(''User'', backref=''clients'') orgname = Column(Unicode, nullable=False) # no need to add a constructor

Luego, puede asociar instancias de modelos de User y Client de dos maneras: asignando un número entero a Client.user_id :

u = User(user_name=u''dusual'') session.add(u) session.flush() # to make sure the id is fetched from the database c = Client(user_id=u.id, orgname="dummy_org") session.add(c)

o al asignar una instancia de User a Client.user .

u = User(user_name=u''dusual'') # no need to flush, no need to add `u` to the session because sqlalchemy becomes aware of the object once we assign it to c.user c = Client(user=u, orgname="dummy_org") session.add(c)

En realidad, hay una tercera forma: desde que configuramos un backref en Client.user , SQLAlchemy agregó un atributo de clients similar a la lista a nuestro modelo de User :

u = User(user_name=u''dusual'') u.clients.append(Client(orgname="dummy_org")) session.add(u)