2017-09-18 2 views
0

Wie ich nächsten mysql Code sqlalchemy übersetzen kann:SqlAlchemy Python. Von mysql sqlalchemy

 SELECT 
       u.id AS writer_id, 
       u.user_login AS user_login, 
       m.message_id AS message_id, 
       m.message, 
       m.time 
      FROM 
       (SELECT 
        message_id, tm.writer_id, tm.receiver_id, message, time 
       FROM 
        test_messages tm 
       WHERE 
        (tm.writer_id = 1 AND tm.receiver_id = 2) 
         OR (tm.writer_id = 2 AND tm.receiver_id = 1) 
       ORDER BY tm.time DESC 
       LIMIT 10 OFFSET 0) AS m 
        LEFT JOIN 
       users u ON u.id = m.writer_id 
      ORDER BY (m.time); 

Ich versuchte weiter:

s = select([ 
    users.c.id, 
    users.c.user_login, 
    messages.c.message_id, 
    messages.c.message, 
    messages.c.time 
]).select_from(
    select([ 
     messages.c.message_id, 
     messages.c.writer_id, 
     messages.c.receiver_id, 
     messages.c.message, 
     messages.c.time 
    ]).where(
     or_(
      and_(
       messages.c.writer_id == writer_id, 
       messages.c.receiver_id == receiver_id 
      ), 
      and_(
       messages.c.writer_id == receiver_id, 
       messages.c.receiver_id == writer_id 
      ) 
     ) 
    ).select_from(
     users.outerjoin(messages, users.c.id == messages.c.writer_id) 
    ).order_by(messages.c.time.desc()) 
).order_by(messages.c.time) 

response = await conn.execute(s) 

headers = response.keys() 
rows = await response.fetchall()  

Probleme mit Aliase zu haben.
pymysql.err.InternalError: (1248, 'Every derived table must have its own alias')
Ich habe die ganze Unterabfrage geschrieben, aber es gibt ein Problem mit Alias. Sollte ich explizit Alias ​​setzen oder was soll ich tun? Hilfe bitte.

+0

Normalerweise würden Sie eine Query nicht so instanziieren, sondern über die Query-Eigenschaft einer Sitzung, oder Sie würden Core-Konstrukte wie 'select()' verwenden. Ich würde empfehlen, dass Sie die Tutorials lesen: http://docs.sqlalchemy.org/en/latest/orm/tutorial.html und http://docs.sqlalchemy.org/en/latest/core/tutorial.html. Auf Ihrem Abfragekonstrukt scheint es, als hätten Sie den Join verpasst. Ihr ursprüngliches SQL wählt aus der Unterabfrage aus, die mit dem Benutzer verbunden ist. Ihr aktuelles SQLA-Konstrukt würde sich der zu bearbeitenden Unterabfrage anschließen. –

+0

@Ilja Everilä Ja, aber ich weiß nicht, wie man Abfrage mit Unterabfrage schreibt. Und mit beitreten. –

+1

Deshalb sollten Sie die Tutorials lesen. Insbesondere die Teilbehandlung [Unterabfragen] (http://docs.sqlalchemy.org/en/latest/orm/tutorial.html#using-subqueries). –

Antwort

0

Wenn Core and the SQL Expression Language verwenden Sie könnte eine äquivalente Abfrage mit bilden:

In [25]: subq = messages.select().\ 
    ...:  where(or_(
    ...:   and_(
    ...:    messages.c.writer_id == writer_id, 
    ...:    messages.c.receiver_id == receiver_id 
    ...:  ), 
    ...:   and_(
    ...:    messages.c.writer_id == receiver_id, 
    ...:    messages.c.receiver_id == writer_id 
    ...:  ) 
    ...: )).\ 
    ...:  order_by(messages.c.time.desc()).\ 
    ...:  limit(10).\ 
    ...:  alias() 

In [26]: s = select([users.c.id, 
    ...:    users.c.user_login, 
    ...:    subq.c.message_id, 
    ...:    subq.c.message, 
    ...:    subq.c.time]).\ 
    ...:  select_from(
    ...:   subq. 
    ...:   outerjoin(users, users.c.id == subq.c.writer_id)).\ 
    ...:  order_by(subq.c.time) 

Beachten Sie die Verwendung von alias(). Ihr ursprüngliches SQL hatte den Join umgekehrt zu Ihrem Abfrage-Konstrukt-Versuch, so dass ich dem ursprünglichen SQL gefolgt bin.

+0

Vielen Dank. Ich sehe, dass ich falsch gemacht habe. Ich habe versucht, Alias ​​nach Subq. subq_al = subq.alias(). Danke. –

+0

Die meisten SQLA-Konstrukte und -Methoden sind insofern "generativ", als sie neue Objekte erzeugen, anstatt die vorhandenen zu ändern. –

+0

Bedeutet das, dass in dieser Zeile: 'subq_al = subq.alias()' ich ein neues Objekt erstellt habe, das sich nicht mit subq verbindet? –