SQLAlchemy und "update" eines Feldes

Installation und Anwendung von Datenbankschnittstellen wie SQLite, PostgreSQL, MariaDB/MySQL, der DB-API 2.0 und sonstigen Datenbanksystemen.
Antworten
doca82
User
Beiträge: 48
Registriert: Mittwoch 16. September 2009, 19:39
Wohnort: Berlin

Bin gerade am rumspielen mit dem sqlalchemy tutorial.
Mir ist klar, dass ich den gewünschten Effekt der Änderung eines Passwortes auch mit einer sql expression hinbekommen könnte...aber was ich will ist das mit dem orm zu verknüpfen...

Kann mir jemand sagen, warum ich mit der query unten nicht die Passwörter der User mit den Merkmalen
<User('mulck','Numa', 'sjks')>
(können auch mehrere gemäß query sein) in der DB ändern kann??


Code: Alles auswählen

from sqlalchemy import *
from sqlalchemy import create_engine
from sqlalchemy.orm import mapper, sessionmaker, relation, backref, clear_mappers
from sqlalchemy.sql.expression import select

from sqlalchemy.ext.declarative import declarative_base

Base = declarative_base()
class User(Base):
    __tablename__ = 'users'
    id = Column(Integer, primary_key=True)
    name = Column(String(50))
    fullname = Column(String(50))
    password = Column(String(50))
    addresses = relation("Address", order_by="Address.id", backref="user")
    
    def __init__(self, name, fullname, password):
        self.name = name
        self.fullname = fullname
        self.password = password
    
    def __repr__(self):
        return "<User('%s','%s', '%s')>" % (self.name, self.fullname, self.password)

class Address(Base):
    __tablename__ = 'addresses'
    id = Column(Integer, primary_key=True)
    email_address = Column(String(50), nullable=False)
    user_id = Column(Integer, ForeignKey('users.id'))
    
    def __init__(self, email_address):
        self.email_address = email_address
    
    def __repr__(self):
        return "<Address('%s')>" % self.email_address

def main():
    conn = 'mysql://...use_unicode=0'
    engine = create_engine(conn, echo=True)
    metadata = Base.metadata
    metadata.create_all(engine)
    Session = sessionmaker(bind=engine)
    session = Session()    

    hier---->query = session.query(User)
    hier---->query = query.filter_by(name ='mulck')
    hier---->query.password = 'nooo'
    session.flush()
    session.commit()
    session.close()
Beste grüße, vielen Dank und frohe Osterfeiertage
Darii
User
Beiträge: 1177
Registriert: Donnerstag 29. November 2007, 17:02

Weil du so, wie du es jetzt versuchst, erstmal das User-Objekt aus der Datenbank holen musst(=die Abfrage ausführen).

Code: Alles auswählen

user = session.query(User).filter_by(name ='mulck').one() # one holt das User-Objekt aus der DB
user.password = "foobar"
session.flush() #... 
Am besten guckst du nochmal ins SA-Tutorial.
doca82
User
Beiträge: 48
Registriert: Mittwoch 16. September 2009, 19:39
Wohnort: Berlin

du hattest recht...;-P vielen Dank...
Aber so richtig ist mir nicht klar woran es lag. Daran, dass ich die Objekte einzeln initialisiert habe anscheinend. Also 1. query = session.query(User) und dann erst 2. query = query.filter_by(name ='mulck')??? Aber welchen unterschied macht das? (sorry bin noch ein OOP anfänger!)
nemomuk
User
Beiträge: 862
Registriert: Dienstag 6. November 2007, 21:49

Das hat nicht direkt etwas mit OOP zu tun, eher damit wie SQLAlchemy sich verhält. Du hast halt nur einen Query erstellt ohne diesen auch "wirklich auszuführen".
Antworten