Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

SQLAlchemy:Buat kueri penghapusan menggunakan self-join di MySQL

SQLAlchemy saat ini mendukung UPDATE..FROM di Postgresql, MySQL, dan lainnya, tetapi kami belum mencoba mendukung DELETE..JOIN.

Namun, tampaknya berfungsi (hampir?), sejauh menghasilkan string 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

cetakan:

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

Namun, database MySQL saya tidak menerima ini, secara default itu membuat INNER JOIN, yang gagal, tetapi jika saya memodifikasi kompiler MySQL untuk tidak melakukan ini, masih gagal :

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

terlihat seperti kata demi kata SQL Anda (oh, kecuali untuk 'hapus jalur FROM jalur'? benarkah?) ?

Bagaimanapun, jika kompiler bawaan tidak melakukannya, opsi Anda adalah menggunakan session.execute("some sql") atau untuk membangun konstruksi kustom dengan ekstensi kompiler .



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. skema mysqldump saja, pembaruan skema tanpa drop

  2. Cara mengatasi kesalahan ini--dbWriteTable()

  3. Server MySQL Mandiri

  4. Mempertahankan nilai kotak teks bahkan setelah penyegaran

  5. Sintaks SQL DROP DATABASE – Didaftarkan oleh DBMS