¿Es posible crear una tabla sin una clave principal en SQLAlchemy? La relación quiero definir es el siguiente:SQLAlchemy uno-a-muchos sin que la tabla secundaria tenga una clave principal
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 se puede ver que realmente no necesita una clave principal, y no tengo la intención de ampliar la relación Quote
en el futuro.
Mi problema concreto es 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'
edición: La pareja (id,quoted_id)
es único, y presentes en la mayoría de los datos, sin embargo, cuando la cita no es directa (y no tiene un quoted_id en ese caso), inserto el texto entrecomillado directamente en la relación de cita. 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 cotizaciones y el uso de la clave externa + número generado aplicación como una tecla p, todavía aunque molesto. Ahora para descubrir la sintaxis.
edición 3:
Resuelto el problema que se describe en edición 2. bastante molesto con la alquimia sql ya que tiene toda la información que necesita para implementar el relatioship incluso cuando el modelado de 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 empezando a cuestionar por qué estoy usando Sql Alchemy, sin él podría implementar UPSINT o CREATE_IF_NOT_EXIST de una manera operaciones asincrónicas utilizando psycopg2. Los ORM realmente necesitan ponerse al día.
¿por qué estás tratando de resistir el uso de uno? ¿es el tamaño? limpieza del modelo de datos? ¿otra razon? – van
Limpieza principalmente. Pero si lo piensas incrementado un seeializer es otra operación de base de datos. –
Sí, pero incluso si no define un PK, la base de datos seguirá guardando uno internamente, y ejecutará la misma operación de incremento.El uso de PKs está muy bien optimizado en todos los RDBMS. Busque "claves primarias sustitutas" en Google, y puede llegar a la conclusión de que tener el PK (incluso si no lo necesita) es, de hecho, el más fácil de modelar RDB. Pero lo más importante, no hay nada que guardes al no tenerlo. Por motivos de rendimiento, es posible que desee definir el índice CLUSTED en columnas (id, quoted_id) en lugar de columna PK si busca principalmente en (id, quoted_id). – van