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进行数据库操作入门指南
网上的代码是用__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,字段用CharField、IntegerField这些 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 有些函数功能还是蛮强大的,没用过 pw,没法对比。
sqlalchemy 基本对付大部分场景了,可 raw sql、sql expression、orm


