Mysql
 sql >> Baza danych >  >> RDS >> Mysql

SQLAlchemy:Utwórz zapytanie usuwające za pomocą samodzielnego łączenia w MySQL

SQLAlchemy obsługuje obecnie UPDATE..FROM w Postgresql, MySQL i innych, ale jak dotąd nie próbowaliśmy obsługiwać DELETE..JOIN.

Jednak wydaje się, że działa (prawie?), jeśli chodzi o generowanie ciągu 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

wydruki:

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

Jednak moja baza danych MySQL tego nie akceptuje, domyślnie renderuje INNER JOIN, co kończy się niepowodzeniem, ale jeśli zmodyfikuję kompilator MySQL, aby tego nie robił, nadal się nie powiedzie:

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

wygląda dokładnie tak, jak twój SQL (och, z wyjątkiem „usuń ścieżki z ścieżek”? czy to prawda?) ?

W każdym razie, jeśli wbudowany kompilator tego nie robi, twoje opcje to użycie session.execute("some sql") lub zbudować niestandardową konstrukcję z rozszerzeniem kompilatora .



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Alternatywa NOT IN na MySQL

  2. wybierz dwa ostatnie wiersze dla każdego użytkownika, aby uzyskać różnicę w kolumnie (MySQL)

  3. Jaki jest dobry sposób na denormalizację bazy danych mysql?

  4. Zaktualizuj zapytanie w Yii

  5. jak połączyć się z serwerem mysql za pomocą wiersza poleceń:błąd