supone lo siguiente en MySQL:SQLAlchemy y se une, que no tienen las claves externas
CREATE TABLE users (
id integer auto_increment primary key,
username varchar(30),
active enum('N','Y'),
created_on int(11),
updated_on int(11),
points int(10),
// other fields
);
CREATE TABLE comments (
id integer auto_increment primary key,
user_id integer,
forum_id integer,
favorited integer,
// other fields
);
Tenga en cuenta que no hay restricciones de clave externa formales se agregan a las tablas. Esto es algo que he heredado y no puedo cambiar en nuestra configuración actual. (Estamos revisando todo el sistema, pero mientras tanto tengo que trabajar con lo que se me ha dado)
Tengo problemas para entender las uniones de SQLalchemy cuando no hay una clave externa formal establecida entre las tablas.
Efectivamente, me gustaría hacer algo como:
SELECT
u.username,
c.forum_id,
count(c.id)
FROM
users u
JOIN comments c ON u.id=c.user_id
WHERE
u.id = 1234
GROUP BY
u.username,
c.forum_id;
Código tengo incluye cosas como la siguiente:
mapper(Users, users, primary_key=[users.c.id],
include_properties=['user_id', 'username', 'active', 'created_on',
'updated_on', 'points'])
mapper(Comments, comments, primary_key=[comments.c.id],
include_properties=['active', 'user_id', 'favorited', 'forum_id'])
j = join(users, comments)
mapper(UserComments, j, properties={'user_id': [users.c.id,
comments.c.user_id]})
session = create_session()
query = session.query(UserComments).filter(users.cid == 1234)
rdata = run(query)
for row in rdata:
print row
... que por supuesto falla con:
sqlalchemy.exc.ArgumentError: Can't find any foreign key relationships
between 'users' and 'comments'.
No estoy seguro de cómo evitar esto cuando no tenemos claves externas. ¿De qué otra manera puedo definir la relación? Pensé que era parte de la llamada mapper():
mapper(UserComments, j, properties={'user_id': [users.c.id,
comments.c.user_id]})
... pero al parecer he leído mal la documentación.
Gracias de antemano por cualquier ayuda.
¿Estás seguro de que deseas mapear realmente la expresión de unión? Aunque SQLAlchemy lo permite, probablemente tenga más sentido hacer algo como 'session.query ([Users, Comments]). Join (Comments, ...)' para que termine con instancias de sus usuarios y modelos de comentarios en su lugar de Frankenstein. Además, dado que una cláusula join no tiene una clave principal, los modelos resultantes son mucho menos útiles, no puede conservar las modificaciones a ese modelo. – SingleNegationElimination