Domanda

In questo codice il campo last_seen viene aggiornato con l'ora corrente ogni volta che l'utente utilizza il sito.Tuttavia, nella chiamata al DB, (Minuel Gridberg "Black Web Development") aggiunge self anziché self.last_seen, che mi confonde.Capisco quali sono i principi di base di OOP, e io (pensiero) capisca cosa è il self (riferimento all'oggetto creato), ma non capisco perché non aggiungiamo self.last_seen nell'ultima riga db.session.add(self)?Codice completo di seguito...

class User(UserMixin, db.Model):
    __tablename__ = 'users'
    id = db.Column(db.Integer, primary_key=True)
    email = db.Column(db.String(64), unique=True, index=True)
    username = db.Column(db.String(64), unique=True, index=True)
    role_id = db.Column(db.Integer, db.ForeignKey('roles.id'))
    password_hash = db.Column(db.String(128))
    confirmed = db.Column(db.Boolean, default=False)
    name = db.Column(db.String(64))
    location = db.Column(db.String(64))
    about_me = db.Column(db.Text())
    member_since = db.Column(db.DateTime(), default=datetime.utcnow)
    last_seen = db.Column(db.DateTime(), default=datetime.utcnow)

def ping(self):
    self.last_seen = datetime.utcnow()
    db.session.add(self)
.

Sembra molto semplice e sono sicuro che lo è, ma ovviamente mi manca qualcosa, o non ho imparato qualcosa che avrei dovuto.Se sapessi cosa a Google per una risposta, avrei certamente fatto così, ma non sono nemmeno sicuro di cosa cercare altro che i principi di Python OOP che pensavo di aver già capito (ho fatto revisione).Qualsiasi aiuto sarebbe molto apprezzato perché questo mi sta facendo impazzire, lol.

È stato utile?

Soluzione

Sta aggiungendo il modello aggiornato al DB. Il modello è cambiato in modo che db.session.add() aggiorni la riga corretta dietro la scena. Non credo che SQLalchemy ti consentirebbe di aggiungere la proprietà del modello perché non saprebbe quale riga di aggiornare

Forse un esempio renderebbe questo più chiaro. Prendiamo il seguente modello:

class User(db.model):
    __tablename__ = 'User'
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(25))
.

Ora ci sono 2 attributi molto importanti sul modello per l'inserimento / aggiornandolo nel DB. Il nome della tabella e l'ID. Quindi aggiungere quel modello al DB con SQL semplice, avremmo bisogno di fare qualcosa come:

INSERT INTO User (name) VALUES ('Some string');
.

Questo è approssimativamente ciò che accade quando si utilizza db.session.add() su un nuovo modello. Per aggiornare il nostro modello dovremmo fare qualcosa come:

UPDATE User
SET name='Some other String'
WHERE id=1;
.

Ora se dovessi passare solo un attributo di un modello a SQLalchemy come sarebbe in grado di capire quale tabella volevi aggiungere a o quale riga dovrebbe essere cambiata? Se hai appena superato self.name a db.session.add() La query finirebbe per sembrare così:

UPDATE  # There is no way to know the table
SET name='Some other String'
WHERE  ; # There is no way to know which row needs to be changed
.

Sqlalchemy molto probabilmente lance un'eccezione se ci provi. Per quanto riguarda il motivo per cui non può dedurre il modello da self che è probabilmente al di fuori del campo di applicazione di una questione così.

Altri suggerimenti

IANAULD ha ragione ... ma farò uno sforzo per cercare di spiegarlo in una moda lunga.

Lasciaci mettere noi stessi nel ruolo di SQLalchemy e fa finta di fingere di essere il metodo db.session.add.

self.last_seen è un oggetto datetime, quindi fa finta di fingere di essere seduto a casa, e una busta arriva attraverso la porta ed è indirizzata a db.session.add. Grande, questo è noi, quindi apriamo e leggiamo il messaggio che dice solo 2014-07-29 nient'altro. Sappiamo che dobbiamo archiviarlo nel cabinet di deposito da qualche parte, ma non abbiamo abbastanza informazioni per farlo, tutto ciò che sappiamo è che abbiamo un datetime, non abbiamo idea di quale User appartenesse, o anche se fa appartenere a un User, è solo un datetime ... siamo bloccati.

Se invece la prossima cosa che arriva attraverso la porta è un pacco, di nuovo indirizzato a db.session.add, e di nuovo lo apriamo-- questa volta è un piccolo modello di un User, ha un nome, un'e-mail-- e persino Un datetime last_seen scritto sul suo braccio. Ora è facile-- Posso andare direttamente al cabinet del deposito e dare un'occhiata per vedere se l'ho già preso lì, e fai qualche cambiamento per farli abbinare, o semplice file questo se è nuovo.

Questa è la differenza-- con un modello ORM, stai passando questi utenti o prodotti completi, o qualsiasi cosa intorno, e SQLalchemy sa che è un db.Model e quindi può sapere come, e dove gestirlo ispezionando i dettagli.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top