conquester
conquester

Reputation: 1132

SQLAlchemy query not working

I have this code which adds a 'user' with the assigned attributes and later searches for it. But get_row() which uses filter_by always returns None.

from sqlalchemy import *
from sqlalchemy.orm import sessionmaker
from sqlalchemy.ext.declarative import declarative_base


Base = declarative_base()


class User(Base):        
    __tablename__ = 'users'
    email = Column('email', String(40), primary_key=True)
    name = Column('name', String(40))
    password = Column('password', String)
    plan = Column('plan', String)
    apikey = Column('apikey', String)
    periodstart = Column('periodstart', Integer)
    confirmed = Column('confirmed', Integer)
    billed = Column('billed', Integer)


class SQLDb:
    def __init__(self, model):
        self.model = model
        uri = 'sqlite:///:memory:'
        self.engine = create_engine(uri, echo=True)
        Session = sessionmaker(bind=self.engine)
        self.session = Session()
        Base.metadata.create_all(self.engine)

    def __enter__(self):
        return self.session

    def modify_row(self, r):
        self.session.add(r)
        self.session.commit()

    def get_row(self, **kwargs):
        self.session.query(self.model).filter_by(**kwargs).first()

    def closedb(self):
        self.session.commit()

    def __exit__(self, a, b, c):
        self.closedb()


if __name__ == "__main__":
    user = User()
    user.email = '[email protected]'
    user.name = 'john'
    user.password = 'test@123'
    user.plan = 'dummy'
    user.periodstart = 0
    user.confirmed = 0
    user.billed = 1
    sdb = SQLDb(User)
    sdb.modify_row(user)
    print(sdb.get_row(name='john'))

Output is always: None

I don't understand what is going wrong here. Can you please explain?

Upvotes: 1

Views: 2387

Answers (1)

matusko
matusko

Reputation: 3777

You just need to return the result from the function. Otherwise it returns None.

def get_row(self, **kwargs):
    return self.session.query(self.model).filter_by(**kwargs).first()

Upvotes: 3

Related Questions