Python中如何使用peewee ORM进行数据库操作入门指南

import os
import datetime
import peewee as pw
from werkzeug.security import generate_password_hash, check_password_hash

database = pw.SqliteDatabase(‘db.sqlite’)

class Model(pw.Model): class Meta: database = database

class User(Model): username = pw.CharField() password_hash = pw.CharField()

@property
def password(self):
    raise AttributeError('password is not readable')

@password.setter
def password(self, password):
    self.password_hash = generate_password_hash(password)

def verify_password(self, password):
    return check_password_hash(self.password_hash, password)

def __str__(self):
    return '<User %r>' %self.username

class Category(Model): tag = pw.CharField() count = pw.IntegerField(default=0)

def __str__(self):
    return '<Category %r>' %self.tag

class Post(Model): title = pw.CharField() body = pw.TextField() summary = pw.CharField()

category = pw.ForeignKeyField(Category, backref='posts')

timestamp = pw.DateTimeField(default=datetime.datetime.now)

def __str__(self):
    return '<Post %r>' %self.title

if name == “main”: if not os.path.exists(‘db.sqlite’): User.create_table() Post.create_table() Category.create_table()

    categoryC = Category.create(tag='C')
    categoryPy = Category.create(tag='Py')

    Post.create(category=categoryC, title='learn c', body='learn c hardly', summary='').save()
    Post.create(category=categoryPy, title='learn py', body='learn py hardly', summary='').save()
    Post.create(category=categoryPy, title='learn flask', body='learn flask hardly', summary='').save()

    for category in Category.select():
        print(category)

        for post in category.posts:
            print('  ', post)


Python中如何使用peewee ORM进行数据库操作入门指南

6 回复

网上的代码是用__repr__,,我试了下不行,,可能新版本改用__str__了


Peewee是个轻量级ORM,用起来挺直接的。先装包:pip install peewee

最基本的用法分三步:定义模型、连接数据库、执行操作。看个完整例子:

from peewee import *
import datetime

# 1. 连接数据库(这里用SQLite,可以换成MySQL/PostgreSQL)
db = SqliteDatabase('my_database.db')

# 2. 定义模型类
class User(Model):
    username = CharField(unique=True)
    email = CharField()
    join_date = DateTimeField(default=datetime.datetime.now)
    is_active = BooleanField(default=True)
    
    class Meta:
        database = db  # 绑定数据库连接

# 3. 创建表
db.connect()
db.create_tables([User])

# 4. 增删改查示例
# 插入数据
user1 = User.create(username='john', email='john@example.com')
user2 = User(username='jane', email='jane@example.com')
user2.save()

# 查询数据
# 获取单个用户
john = User.get(User.username == 'john')
print(f"Found: {john.username}, {john.email}")

# 查询多个用户
active_users = User.select().where(User.is_active == True)
for user in active_users:
    print(user.username)

# 更新数据
User.update(is_active=False).where(User.username == 'john').execute()

# 删除数据
User.delete().where(User.username == 'jane').execute()

# 关闭连接(SQLite需要,其他数据库通常不需要)
db.close()

几个关键点:

  • 模型类继承Model,字段用CharFieldIntegerField这些
  • create()save()都能插入数据,create()直接返回实例
  • 查询用get()拿单条,select()拿多条
  • 更新删除后面要跟execute()才会执行

外键关联也简单:

class Tweet(Model):
    user = ForeignKeyField(User, backref='tweets')
    content = TextField()
    timestamp = DateTimeField(default=datetime.datetime.now)

这样就能用user.tweets查用户的推文了。

总结:Peewee的API设计很直观,文档也全,上手快。

楼主对比过 sqlalchemy 没,用起来有什么差别吗?


简单看过网上两个例子,,感觉 sqlalchemy 写起来更麻烦些,,比如定义外键时需要两边都得定义

我就做个小博客,,用不着 sqlalchemy 那么高级的东西

反正从来不用外键,觉得 sqlalchemy 有些函数功能还是蛮强大的,没用过 pw,没法对比。

sqlalchemy 基本对付大部分场景了,可 raw sql、sql expression、orm

回到顶部