2017-09-18 1 views
0

へ:SqlAlchemy Python。 MySQLからの私はSQLAlchemyの隣に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); 

私は次の試みた:

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()  

はエイリアスの問題を持ちます。
pymysql.err.InternalError: (1248, 'Every derived table must have its own alias')
サブクエリ全体を書きましたが、エイリアスに問題があります。明示的にエイリアスを設定すべきか、何をすべきですか? お願いします。あなたと同等のクエリを形成することができるCore and the SQL Expression Languageを使用して

+0

あなたは通常、そのような 'Query'をインスタンス化するのではなく、セッションの' query'プロパティを通して、あるいは 'select()'のようなCore構造体を使用します。チュートリアル(http://docs.sqlalchemy.org/en/latest/orm/tutorial.htmlおよびhttp://docs.sqlalchemy.org/en/latest/core/tutorial.html)を読むことをお勧めします。あなたのクエリ構造では、あなたが参加を誤ってしまったようです。元のSQLはサブクエリから選択し、ユーザーと結合しました。現在のSQLA構文がサブクエリに結合されます。 –

+0

@IljaEveriläはい、でもサブクエリを使ってクエリを書く方法はわかりません。そして参加する。 –

+1

そのため、チュートリアルを読む必要があります。特に[subqueries](http://docs.sqlalchemy.org/ja/latest/orm/tutorial.html#using-subqueries)を扱う部分。 –

答えて

0

の場合:

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) 

alias()の使用に注意してください。あなたの元のSQLは、あなたのクエリ構築の試みと比べて、別の方法で結合していました。元のSQLに従ってきました。

+0

ありがとうございました。私は間違っていたことが分かります。私はsubqの後にエイリアスを試みました。 subq_al = subq.alias()。ありがとうございます。 –

+0

SQLAの構造とメソッドのほとんどは、既存のものを変更するのではなく新しいオブジェクトを生成するという点で "生成的"です。 –

+0

この行では、 'subq_al = subq.alias()'私はsubqに接続しない新しいオブジェクトを作成しましたか? –

関連する問題