2017-10-24 1 views
0

Ich versuche, einige Datensätze aus meinem db zu löschen. Ich habe eine Kaskade erstellt, um auch alles zu löschen, was mit dem Datenaufzeichnen zusammenhängt. Mein Problem ist jetzt, dass, wenn ich mehr als eine Datenaufzeichnung mit dem gleichen Namensattribut habe und ich alle sie löschen möchte. So zum Beispiel habe ich 3 Datensätze und zwei haben ein Attribut name = Max und das letzte hat das Attribut name = Peter. Wie kann ich jetzt beide Max löschen? Dies ist der Code, den ich bisher bekommen habe:SQLAlchemy löschen Sie alle Elemente und nicht nur die erste

def delete_anw(engine): 
    Session = sessionmaker(bind=engine) 
    session = Session() 
    f = session.query(Anwendung).filter_by(name="Max").first() 
    session.delete(f) 
    session.commit() 

Dieser Code löscht nur die erste Abfrage, die es findet. Ich weiß, es ist wegen der first(), aber gibt es eine Methode wie all(), um alle Datensätze zu löschen, die den Namen Max haben?

+0

Siehe: https://Stackoverflow.com/a/7954618/4367 (schlägt vor, dass Sie syncuse_session verwenden) – Rick

+0

Nach dem Versuch mit synchronize_session immer noch diesen Schlüssel (ID) = (9) wird immer noch aus der Tabelle verwiesen. – Blinxen

+0

Haben Sie versucht, "Wenn zwei Abfragen nicht ausgeführt werden sollen, übergeben Sie stattdessen synchronize_session = False und rufen Sie dann session.expire_all() sofort nach dem Löschen auf, um einen inkonsistenten Status im MetaData-Speicher zu vermeiden." Teil? Wenn Sie FK-Beschränkungen haben, stellen Sie sicher, dass sie das gewünschte Verhalten kaskadieren. – Rick

Antwort

2

Entfernen Sie einfach die .first() Methode und fügen Sie auf die Abfrage selbst löschen

session.query(Anwendung).filter_by(name="Max").delete() 

http://docs.sqlalchemy.org/en/latest/orm/query.html#sqlalchemy.orm.query.Query.delete Schauen Sie sich diese Referenz

+0

Nun, das Problem ist, dass dies nicht funktioniert, wenn Sie Beziehungen zwischen den Tabellen haben. Oder fehlt mir etwas? – Blinxen

+0

Ich glaube nicht, dass das der Fall ist. Die zugehörigen Objekte sind betroffen, sobald session.commit ausgegeben wird oder session.expire_all wie in der Antwort @Rick angegeben wird. – yesemsanthoshkumar

+0

@Blinxen Teilweise korrekt. 'Query.delete()' ist eine Massenoperation, die ** In-Python-Kaskaden ** umgeht, also hängt davon ab, wie Sie insbesondere Ihre Beziehungen und Fremdschlüssel konfiguriert haben; In-DB Kaskaden werden wie üblich feuern. –

-2
''' 
Created on 2017年10月24日 

@author: leemengwei 
''' 

from sqlalchemy import create_engine 
from sqlalchemy.orm import sessionmaker 
from sqlalchemy import Column,Integer,String 
from sqlalchemy.ext.declarative import declarative_base 


Base = declarative_base() 

class Anwendung(Base): 
    __tablename__ = 'tab1' 

    id = Column(Integer, primary_key=True) 
    name = Column(String) 


def delete_anw(): 
    session = Session() 
    f = session.query(Anwendung).filter_by(name="Max").delete() 
    print('records deleted:',f) 
    session.commit() 
    session.close() 

def query_anw(): 
    session = Session() 
    f = session.query(Anwendung).filter_by(name="Max").all() 
    print('records matched:',len(f)) 
    session.close() 

if __name__=='__main__': 
    engine = create_engine("mysql+pymysql://[email protected]/test",echo=True) 
    Session = sessionmaker(bind=engine) 

    query_anw() 
    delete_anw() 
    query_anw() 

Der obige Code funktioniert gut für me.The Datensätze gefunden werden und gelöscht.

+0

Sie können so etwas nicht schreiben. Bitte versuchen Sie zu erklären, was Sie zu tun versuchen und welches Problem Sie haben. –

+0

sorry.sind Blinxen sagte "Dies ist der Code, den ich bis jetzt", also schreibe ich ein komplettes Beispiel, das erklärt, wie mehr als einen Datensatz von sqlAlchemy gelöscht werden. – leemengwei

+0

sorry.Sein Herr Blinxen sagte: "Dies ist der Code, den ich bis jetzt bekommen habe", also schreibe ich ein komplettes Beispiel, das erklärt, wie mehr als ein Datensatz durch sqlAlchemy.use Abfrage vor und nach dem Löschen zu löschen, um zu zeigen, dass die Datensätze sind erfolgreich gelöscht.Ich hoffe, dies wird hilfreich sein, damit die anderen den Code direkt und ohne die Notwendigkeit, Dokumente zu suchen, verwenden können. – leemengwei

Verwandte Themen