在sqlalchemy中使用查询和过滤器来修改User表

时间:2015-07-30 19:27:12

标签: python mysql sqlalchemy

sqlalchemy新手。

我试图弄清楚如何最好地使用查询和过滤器来根据创建的实例下的条目选择特定的用户,例如' a.create_user(' guy',' Joe',' Smo',...)(如a.retrieve_user(某些用户名,我为用户创建的一些密码。

我创建了一个名为BaseModify的类,我想用它来访问我创建的函数,以便根据正确的用户名/密码组合检索它们。我还想基于调用retrieve_user(如果正确的话)更新它们然后可以更新。我尝试了下面的代码,但它打印出用户,无论正确的参数是什么,这是非常有问题的。任何帮助的解释都是真的很感激。

创建用户在这里工作......我已经通过这里的一些帮助进行了调整。

class BaseModify(object):
    def __init__(self):
        self.session = Session()

# Create User

    def create_user(self, username, password, firstname, lastname):
        new_user = User(username, password, firstname, lastname)
        self.session.add(new_user)
        self.session.commit()
        print(username, firstname, lastname) 

  def retrieve_user(self, username, firstname, lastname):
        users = self.session.query(User).\
        filter(User.username == username).\
        filter(User.firstname == firstname).\
        filter(User.lastname == lastname).all()
        for user in users:
            print(user.username, user.firstname, user.lastname)

    def update_user(self, username): 
        up = self.session.query(User).filter(User.username == username).first()
        print up.username
        if up:
            up.username = username
            new_username = up.username 
        return new_username
        self.session.commit()


    def delete_user(self, username, password):
        deluser = self.retrieve_user(username, firstname, lastname)
        if deluser:
            self.session.query(User).filter(User.username == username).\
            filter(User.firstname == firstname).\
            filter(User.lastname == lastname)
            self.session.delete(User)
            self.session.flush() 


""" instantiate (create) instances of the API below: """

a = BaseModify()

#create  
a.create_user('dance', 'cats', 'Jas', 'Lo') 
a.create_user('wizzard', 'linux', 'Bree', 'Jane')

a.retrieve_user('dance', 'cats')  
a.retrieve_user('wizzard', 'dogs')   
print(a)

我已经对顶部进行了更新。尝试通过" update_user"简单地更改用户名和" delete_user"通过调用"检索"清理代码的方法。根据我的理解,查询/过滤器是搜索表,然后代码的其余部分是python做的事情。那对吧???最佳实践??

1 个答案:

答案 0 :(得分:1)

对于我来说,不清楚你想要对每种方法做些什么,但是很少有错误很容易解决,而且我从你的帖子中我所理解的就是尽力而为。如果你进一步解释你想要的东西,你得到的错误和你期望的,我可以相应地改进我的答案。

  • 方法retrieve_user

首先你应该纠正它,你没有使用传递给方法的参数,

def retrieve_user(self, username, password):
    found = select([User.username]).where(User.password == password)
    users = self.session.query(User).filter(User.username.in_(found)).all()
    for user in users:
        print(user.username)

请注意,您也可以像这样编写子查询found

    found = self.session.query(User.username).filter(User.password == password)

无论如何,对我而言,仅仅通过检查密码来获取用户是没有意义的,我想这样做会更有意义,

def retrieve_user(self, username, password):
    users = self.session.query(User).filter(User.username == username).filter(User.password == password).all()
    for user in users:
        print(user.username)
  • 方法update_user

类似地,

def update_user(self, username): 
    up = session.query(User).filter(User.username == username).first()
    print up.username
    up.username = username
    self.session.commit()

(虽然显然使用这种方法你做得不多,你应该将username和new_username传递给方法,然后做up.username = new_username

在您帖子中的retrieve_user的第二个版本中,我也有点迷失,我不知道您为什么要检索会话中已有的用户,但无论如何您都缺少你filter陈述中的平等。

希望它有所帮助。

编辑:经过一些评论后改进版update

def update_user(self, username, new_username): 
    up = self.session.query(User).filter(User.username == username).first()
    if up:
        up.username = new_username
    self.session.commit()

我建议你阅读this了解会话的一些指导原则。