2016-12-05 1 views
1

Ich baue eine Python-App mit Flask und SQL Alchemy mit einer SQLite3-Db-Engine. Ich muss die Tabellengröße auf 1000 Zeilen begrenzen und wenn dieses Limit erreicht ist, sollte der älteste Eintrag gelöscht werden, um Platz für den neuen zu schaffen. Wie im Beispiel unten:Flask SqlAlchemy gibt es eine Möglichkeit, die Tabellengröße auf n Zeilen zu begrenzen

| id | uuid | name | type | 
________________________________________ 
| 1 | 78c0 | Danny | chef | 
| 2 | 7966 | Mike | welder | 
| . | ... | ... | ...  | 
|1000 | ef1b | John | fireman | 

Nach dem nächsten INSERT INTO sollte die Tabelle wie folgt aussehen:

| id | uuid | name | type | 
________________________________________ 
| 2 | 7966 | Mike | welder | 
| . | ... | ... | ...  | 
|1000 | ef1b | John | fireman | 
|1001 | 7ce4 | Fez | doctor | 

Gibt es eine Möglichkeit, dies zu erreichen, wenn ich meine Modelle zu erstellen oder irgendwo in der Config-Datei? Lassen Sie sich meine Modelle sagt Datei ist:

class People(db.Model): 
    id = db.Column(db.Integer, primary_key=True) 
    uuid = db.Column(db.String, unique=True, nullable=False) 
    name = db.Column(db.String(120), nullable=False) 
    type = db.Column(db.String(120)) 
+0

Ich glaube, es durch Verwendung von gespeicherten Prozeduren möglich ist, aber sie sind nicht in die SQLite. Sie müssen diese Einschränkung also manuell überprüfen. – wanderlust

+0

Nur eine Kuriosität: Woher kommt diese Anforderung? – van

+0

Lagerung. Die Tabelle, die ich gepostet habe, war nur ein Beispiel, aber in Wirklichkeit speichere ich Daten in Bezug auf einige Jobs (Prozesse): PID, Pfad zur Protokolldatei, Ausführungszeit, etc ... und ich muss keine Historie größer halten als 1000 Reihen. Die db kann leicht zu Hunderten von GB ... – skamsie

Antwort

1

sein kann es schlechter Stil, aber man kann so etwas tun:

class People(db.Model): 
    ... 
    timestamp = db.Column(db.DateTime, default=datetime.utcnow) 
    ... 

def insert_person(person): 
    db.session.add(person) 
    row_count = Person.query.count() 
    if row_count > 1000: 
     first_person = User.query.order_by(Person.timestamp.asc()).first() 
     db.session.delete(first_person) 
    db.session.commit() 
+0

Vielen Dank. Ich dachte daran, etwas Ähnliches zu implementieren, aber ich hoffte, dass es eine versteckte SQLAlchemy-Einstellung gibt, die es automatisch tun würde :). – skamsie

+0

tatsächlich hat sqlalchemy Ereignisse, aber wenn Sie eines der Ereignisse before_insert oder after_insert verwenden, ist es nicht möglich, eine Chance zu machen, es schließt die Sitzung, so dass Sie nicht tun können. – metmirr

Verwandte Themen