python - create - sqlalchemy select
SQLAlchemy uno a muchos sin que la tabla secundaria tenga una clave principal (2)
Supongo que @TokenMacGuy tiene razón, y realmente está confundiendo las nociones de PrimaryKey
y una surrogate key
. En cuyo caso, la respuesta a su pregunta es:
- NO , SA no admite tablas (y por lo tanto, relaciones con tablas) sin una clave principal
- y NO , no necesita crear una clave sustituta para cada tabla con el propósito de servir como
primary key
. Puede definir un PK usando cualquier combinación de columnas con que sea único.
Vea el siguiente código para un ejemplo:
class TPost(Base):
__tablename__ = ''forum_post''
id = Column(Integer, primary_key = True)
post_text = Column(String)
quotes = relationship("TQuote", backref="post")
class TQuote(Base):
__tablename__ = "forum_quotes"
id = Column(Integer, ForeignKey("forum_post.id"))
is_direct = Column(Boolean)
quoted_text = Column(String)
quoted_id = Column(Integer)
__table_args__ = (PrimaryKeyConstraint(id, quoted_id),)
¿Es posible crear una tabla sin una clave principal en SQLAlchemy? La relación que quiero definir es la siguiente:
class TPost(Base):
__tablename__ = "forum_post"
id = Column(Integer, primary_key = True)
topic_id = Column(Integer, ForeignKey("forum_topic.id"))
index = Column(Integer)
page = Column(Integer)
user_id = Column(Integer, ForeignKey("forum_user.id"))
posted_at = Column(DateTime)
post_text = Column(String)
has_quotes = Column(Boolean)
quotes = relationship("TQuote")
class TQuote(Base):
__tablename__ = "forum_quotes"
id = Column(Integer, ForeignKey("forum_post.id"))
is_direct = Column(Boolean)
quoted_text = Column(String)
quoted_id = Column(Integer)
Como puede ver, realmente no necesito una clave principal, y no tengo la intención de extender la relación de Quote
en el futuro.
Mi problema específicamente está representado por este mensaje de error:
sqlalchemy.exc.ArgumentError: Mapper Mapper|TQuote|forum_quotes
could not assemble any primary key columns for mapped table ''forum_quotes''
edit: el par (id,quoted_id)
es único y se presenta para la mayoría de los datos, sin embargo, cuando la cita no es directa (y no tiene un valor de cotización en ese caso), inserto el texto entrecomillado directamente en el relación de citas Podría usar un enfoque de tabla dual (donde las comillas indrect tienen una tabla con una clave principal), pero realmente preferiría implementar esto como una relación de uno a varios. No quiero tener que hacer más de una sola unión.
editar 2:
Voy a numerar las comillas y usar el número de clave foránea + generado como una pkey, todavía molesto. Ahora para descubrir la sintaxis.
editar 3:
Resolvió el problema como se describe en la edición 2. Muy molesto con la alquimia SQL, ya que tiene toda la información que necesita para implementar la relación incluso cuando se modelan los datos en un nivel alto. Entiendo las razones por las que Sql Alchemy quiere tener una clave principal (hace que el orm sea más fácil de implementar).
Estoy comenzando a preguntarme por qué estoy usando Sql Alchemy, sin él podría implementar UPSING o CREATE_IF_NOT_EXIST de una manera como operaciones asincrónicas usando psycopg2. Los ORM realmente necesitan ponerse al día.
Agregue una columna adicional para dar un índice a las comillas y luego agregue una clave compuesta de esta nueva columna + la clave externa.