【问题标题】:Python-peewee get last saved rowPython-peewee 获取最后保存的行
【发布时间】:2014-08-31 18:04:50
【问题描述】:

有没有办法在使用 peewee 及其所有属性时获取数据库中最后保存的行? 假设我这样做:

user = User.create(
    email = request.json['email'],
    nickname = request.json['nickname'],
    password = request.json['password'],
    salt = "salt"
)

但是user.idNone,我能得到的唯一属性就是上面指定的那些。 我可以调用select() 方法,但没有更快的方法吗?

谢谢

【问题讨论】:

  • 不管怎样,如果用户有一个“id”的主键字段,“id”将在创建/保存时自动填充。

标签: python orm peewee


【解决方案1】:
User.select().order_by(User.id.desc()).get()

这将获取最后创建的用户,假设 ID 是一个自动递增的整数(默认值)。

或者如果你想得到例如最后创建的客户(用户),可以这样写:

User.select().where(User.type == "customer").order_by(User.id.desc()).get()

如果要获取最后一个保存的用户,则需要添加时间戳来指示该用户的保存时间。


更新:

Peewee 现在还支持 Postgres 数据库的 RETURNING 子句。您可以将RETURNING 子句添加到任何INSERTUPDATEDELETE 查询。查看文档:

【讨论】:

  • 如果没有行即表为空,则会引发错误!
  • @ChangZhao 你可以把它包装在 try/except 中然后收工!
【解决方案2】:

我猜你的 User 模型看起来像这样:

class User(Model):
    id = IntegerField(primary_key=True)
    email = TextField(unique=True)
    nickname = TextField()
    password = TextField()
    salt = TextField()

但是 peewee 不知道如何处理自动递增字段,除非你使用它的 PrimaryKeyField 类:

class User(Model):
    id = PrimaryKeyField()
    email = TextField(unique=True)
    nickname = TextField()
    password = TextField()
    salt = TextField()

这在我能找到的任何地方都没有记录。 Source.

【讨论】:

    【解决方案3】:

    除了重新查询数据库之外,一种替代方法如下:

    u = User(email="..", nickname="..", password="..", salt="..")
    u.save()
    
    # at this point, peewee inserted the entry in the DB,
    # and updated all relevant fields (including the ID).
    # For example, you can do the following:
    
    print "ID of last-created user: %d" % u.id
    

    对于复杂的多线程系统,我认为这是一个更好的选择。

    【讨论】:

    • Peewee 现在还支持RETURNING(仅限 postgres),它适用于 INSERT、UPDATE 和 DELETE 查询。 Docs here.
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-25
    • 1970-01-01
    • 1970-01-01
    • 2018-05-09
    • 1970-01-01
    • 2014-09-26
    相关资源
    最近更新 更多