sql >> データベース >  >> RDS >> Mysql

SQLAlchemy:MySQLで自己結合を使用して削除クエリを作成する

    SQLAlchemyは現在、Postgresql、MySQLなどでUPDATE..FROMをサポートしていますが、現時点ではDELETE..JOINをサポートしようとはしていません。

    ただし、SQL文字列を生成する限り、(ほぼ?)機能しているように見えます:

    class Path(Base):
        __tablename__ = "path"
    
        id = Column(Integer, primary_key=True)
        descendant = Column(Integer)
        ancestor = Column(Integer)
    
    j = join(Path, p1, p1.ancestor == 5)
    d = delete(j).where(Path.descendant == p1.descendant)
    print d
    

    プリント:

    DELETE FROM path JOIN path AS p1 ON p1.ancestor = :ancestor_1 
     WHERE path.descendant = p1.descendant
    

    ただし、私のMySQLデータベースはこれを受け入れていません。デフォルトでは、INNER JOINがレンダリングされて失敗しますが、これを行わないようにMySQLコンパイラを変更しても、失敗します:

    s.execute(d)
    
    (ProgrammingError) (1064, "You have an error in your SQL syntax; check the manual that 
    corresponds to your MySQL server version for the
    right syntax to use near 'JOIN path AS p1 ON p1.ancestor = 5 WHERE
    path.descendant = p1.descendant' at line 1") 'DELETE FROM path JOIN
    path AS p1 ON p1.ancestor = %s WHERE path.descendant = p1.descendant'
    (5,)
    

    SQLのように見えます(「パスからパスを削除する」を除いて、そうですか?)?

    いずれにせよ、組み込みコンパイラがそれを実行していない場合、オプションはsession.execute("some sql")を使用することです。 または、コンパイラ拡張機能 を使用してカスタムコンストラクトを作成します 。



    1. $_POST変数が$_FILESおよびmultipart/form-dataで機能しない

    2. node.JSの日付形式

    3. mysql+PDOのデータを使用して成長ベビーチャートを作成する方法

    4. フォームとレポートのコントロールを使用する場合の10の便利なMicrosoftAccessショートカット