gpt4 book ai didi

python - 使用sqlalchemy中的查询和过滤器修改User表

转载 作者:行者123 更新时间:2023-11-29 12:04:39 24 4
gpt4 key购买 nike

sqlalchemy 新手。

我试图找出如何最好地使用查询和过滤器来根据创建的实例下的条目选择特定用户,例如'a.create_user('guy', 'Joe', 'Smo', ...) (如我为用户创建的 a.retrieve_user(some username, ... some password) 所示。

我创建了一个名为 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)

我已经对顶部进行了更新。尝试通过调用“retrieve”方法来清理代码,通过“update_user”和“delete_user”简单地更改用户名。据我了解,查询/过滤器是搜索表,然后剩下的代码是 python 做一些事情。是这样吗???最佳实践??

最佳答案

对我来说,并不完全清楚你想用每种方法做什么,但有一些错误很容易解决,下面我会尽力从你的帖子中理解。如果您进一步解释一下您想要什么、您得到的错误以及您的期望,我可能会相应地改进我的答案。

  • 方法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 中,我也有点迷失,我不知道您为什么要检索 session 中已有的用户,但无论如何您的 filter 语句中缺少等式。

希望有帮助。

编辑:经过一些评论后,更新的改进版本。

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有关 session 的一些指导方针。

关于python - 使用sqlalchemy中的查询和过滤器修改User表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31732423/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com