【问题标题】:Peewee : How to update specific fields?Peewee:如何更新特定字段?
【发布时间】:2017-07-20 07:29:35
【问题描述】:

我使用Peewee 处理数据库。我有一个带有 3 个字段的 User 表:usernamepasswordlast_login。当用户登录系统时,我想更新last_login。我使用了以下代码行:

from peewee import *
import datetime

class User(Model):
    username = CharField(unique=True)
    password = CharField()
    last_login = DateTimeField(default=datetime.datetime.now())

    class Meta:
        database = MySQLDatabase('mydb', user='root', charset='123456')


u=User(username="user1", last_login=datetime.datetime.now())
u.save()

虽然我没有为password 指定任何值,但在调用u.save() 后它会被覆盖。我应该如何强制 peewee 只更新 last_login 字段?

【问题讨论】:

    标签: database python-2.7 orm peewee


    【解决方案1】:

    u.save() 替换为:

    u.save(only=[User.last_login])
    

    正如API's documentation 所说:

    only (list) – 要保留的字段列表 – 提供时,仅保留给定的字段。

    因此,您应该指定要更改的字段列表。

    【讨论】:

      【解决方案2】:

      您可以在调用save() 时使用only 参数。 http://docs.peewee-orm.com/en/latest/peewee/api.html#Model.save

      当用户登录系统时,我想更新 last_login。我使用了以下代码行:

      如果你想这样做,你应该做一个原子更新,但是:

      User.update({User.last_login: datetime.datetime.now()}).where(User.username == 'whatever').execute()
      

      【讨论】:

      • 有什么区别?哪种方法更好?
      【解决方案3】:

      以下代码将演示如何在数据库中创建、获取和更新记录:

      now = datetime.datetime.now()
      
      # create a user
      u = User.create(username="user1", password="bla", last_login=now)
      # now `u` has your user, you can do: print u.username, u.password, u.last_login
      
      # get an existing user from the db
      u = User.get(User.username == "user1")
      print u.username, u.password, u.last_login
      
      sleep(1)
      now = datetime.datetime.now()
      
      # update an existing user
      u = User.update(password="blabla", last_login=now).where(User.username == "user1")
      u.execute()
      

      【讨论】:

      • 我不想更改密码。你的代码改变了它。
      【解决方案4】:

      如果你只想保存修改过的字段,可以使用下面的方法:

      class User(Model):
          username = CharField(unique=True)
          password = CharField()
          last_login = DateTimeField(default=datetime.datetime.now())
      
          class Meta:
              database = MySQLDatabase('mydb', user='root', charset='123456')
      
              # This method saves only modefied fields
              only_save_dirty = True
      
      u=User(username="user1", last_login=datetime.datetime.now())
      u.save()
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-11-30
        • 2012-01-23
        • 2019-04-10
        • 2016-02-17
        • 1970-01-01
        • 1970-01-01
        • 2021-06-05
        相关资源
        最近更新 更多