链接数据库
from peewee import *
# 使用SQLite 并创建缓存
sqlite_db = SqliteDatabase('/path/to/app.db', pragmas={
'journal_mode': 'wal',
'cache_size': -1024 * 64})
"""
这段代码是在 Peewee 框架中创建一个 SQLite 数据库连接,并设置了一些数据库的 pragma 参数。
SqliteDatabase('/path/to/app.db'):这一部分指定了数据库文件的路径。你需要将 '/path/to/app.db' 替换为实际的数据库文件路径。这个路径将是你的 SQLite 数据库文件存储的位置。
pragmas:这是一个参数字典,用于设置数据库的 pragma(特殊的配置选项)。在这个例子中,使用了两个 pragma:
'journal_mode': 'wal':这将设置数据库的日志模式为 "Write-Ahead Logging" (WAL)。WAL 是一种日志模式,可以提供更好的并发性能和可靠性,特别是在多线程或多进程的情况下。
'cache_size': -1024 * 64:这将设置数据库的缓存大小为 64MB。缓存用于加速数据库的读写操作,通过将频繁访问的数据保留在内存中。这里的 -1024 * 64 表示缓存大小为 64MB。
综合起来,这段代码的作用是创建一个 SQLite 数据库连接,并设置数据库的日志模式为 WAL,并将缓存大小设置为 64MB。这些设置可以根据你的应用需求和硬件资源来进行调整。
"""
# 链接 MySQL 或者 MariaDB
mysql_db = MySQLDatabase(database='App', user='app', password='db_password',
host='10.1.0.8', port=3306)
# 链接 Postgres
pg_db = PostgresqlDatabase(database='App', user='postgres', password='secret',
host='10.1.0.9', port=5432)
链接mysql和Postgre时还需要安装数据库驱动
pip install PyMySQL
pip install psycopg2
模型绑定
当用peewee开始一个项目时,通常最好从你的 数据模型,通过定义一个或多个``类:
from peewee import *
db = SqliteDatabase('people.db')
# 通过class Meta 绑定数据库
class Person(Model):
name = CharField()
birthday = DateField()
class Meta:
database = db # 指定数据库对象
# 通过Base类 绑定数据库
class BaseModel(Model):
class Meta:
database = db_sqlite
class Person(BaseModel):
name = CharField()
birthday = DateField()
执行原生SQL
db.execute_sql("ATTACH DATABASE ':memory:' AS cache;")
# 返回可迭代对象时
cursor = db.execute_sql('SELECT * FROM users WHERE status = ?', (ACTIVE,))
for row in cursor.fetchall():
pass
上下文管理器
用作上下文管理器:atomic
db = SqliteDatabase(':memory:')
with db.atomic() as txn:
# 这是最外层,所以这个块对应一个事务。
User.create(username='charlie')
with db.atomic() as nested_txn:
# 这个块对应一个保存点(savepoint)。
User.create(username='huey')
# 这将回滚上面的 create() 查询。
nested_txn.rollback()
User.create(username='mickey')
# 当块结束时,事务将被提交(假设没有出现错误)。在那时会有两个用户,"charlie" 和 "mickey"。
可以使用该方法执行获取或创建操作,如下所示 井:atomic
try:
with db.atomic():
user = User.create(username=username)
return 'Success'
except peewee.IntegrityError:
return 'Failure: %s is already in use.' % username
"""
解释如下:
with db.atomic()::这个块创建了一个数据库事务。所有的操作在这个块中要么一起成功提交,要么一起回滚。
User.create(username=username):在事务中,这行代码尝试创建一个新的用户记录,使用给定的用户名。
return 'Success':如果成功创建了用户记录,这个返回语句将在事务块结束时返回 "Success"。
except peewee.IntegrityError::如果在事务中发生了完整性错误(通常是因为唯一性约束),则执行以下代码块。
return 'Failure: %s is already in use.' % username:在发生完整性错误时,这个返回语句将返回一个包含已经存在的用户名的错误消息。
总之,这段代码尝试在数据库中创建一个新用户记录。如果成功,它返回 "Success",如果失败(因为用户名已存在),它返回一个错误消息。使用事务是为了确保创建用户和错误处理都在一个原子操作中完成,从而保持数据的一致性。
"""
模型与字段
支持的字段类型
Field Type | Sqlite | Postgresql | MySQL |
---|---|---|---|
AutoField |
integer | serial | integer |
BigAutoField |
integer | bigserial | bigint |
IntegerField |
integer | integer | integer |
BigIntegerField |
integer | bigint | bigint |
SmallIntegerField |
integer | smallint | smallint |
IdentityField |
not supported | int identity | not supported |
FloatField |
real | real | real |
DoubleField |
real | double precision | double precision |
DecimalField |
decimal | numeric | numeric |
CharField |
varchar | varchar | varchar |
FixedCharField |
char | char | char |
TextField |
text | text | text |
BlobField |
blob | bytea | blob |
BitField |
integer | bigint | bigint |
BigBitField |
blob | bytea | blob |
UUIDField |
text | uuid | varchar(40) |
BinaryUUIDField |
blob | bytea | varbinary(16) |
DateTimeField |
datetime | timestamp | datetime |
DateField |
date | date | date |
TimeField |
time | time | time |
TimestampField |
integer | integer | integer |
IPField |
integer | bigint | bigint |
BooleanField |
integer | boolean | bool |
BareField |
untyped | not supported | not supported |
ForeignKeyField |
integer | integer | integer |
字段初始化参数
字段初始化参数
所有字段类型接受的参数及其默认值:
null = False
– 允许空值index = False
– 在此列上创建索引unique = False
– 在此列上创建唯一索引。另请参阅添加复合索引。column_name = None
– 明确指定数据库中的列名。default = None
– 用作未初始化模型默认值的任何值或可调用值primary_key = False
– 表的主键constraints = None
- 一个或多个约束,例如[Check('price > 0')]
sequence = None
– 序列名称(如果后端支持)collation = None
–用于对字段/索引进行排序的排序规则unindexed = False
– 指示虚拟表上的字段应取消索引(仅限 SQLite)choices = None
– 可选可迭代,包含 2 元组 ,value``display
help_text = None
– 表示此字段的任何有用文本的字符串verbose_name = None
– 表示此字段的“用户友好”名称的字符串index_type = None
– 指定自定义索引类型,例如,对于 Postgres,您可以指定 OR 索引。'BRIN'``'GIN'
max_length
-固定长度
创建表
# Create the tables.
db.create_tables([User, Tweet])
批量插入
with db.atomic():
for data_dict in data_source:
MyModel.create(**data_dict)
PWIZ,模型生成器
pwiz
是一个随peewee一起提供的小脚本,能够 自检现有数据库并生成适用于 与基础数据交互。如果您已经有一个数据库,pwiz 可以 通过生成具有正确列的框架代码为您提供很好的提升 关联和外键。
如果使用 安装 peewee ,pwiz 将作为 “脚本”,您可以运行:setup.py install
python -m pwiz -e postgresql -u postgres my_postgres_db
这会将一堆模型打印到标准输出。所以你可以这样做:
python -m pwiz -e postgresql my_postgres_db > mymodels.py
python # <-- fire up an interactive shell
>>> from mymodels import Blog, Entry, Tag, Whatever
>>> print([blog.name for blog in Blog.select()])
命令行选项
PWIZ 接受以下命令行选项:
选择 | 意义 | 例 |
---|---|---|
-h | 显示帮助 | |
-e | 数据库后端 | -e mysql |
-H | 要连接到的主机 | -H 远程.db服务器 |
-p | 要连接的端口 | -p 9001 |
-u | 数据库用户 | -u postgres |
-P | 数据库密码 | -P(将提示输入密码) |
-s | 图式 | -s 公共 |
-t | 要生成的表 | -t 推文,用户,关系 |
-v | 为视图生成模型 | (无参数) |
-i | 将信息元数据添加到生成的文件 | (无参数) |
-o | 保留表列顺序 | (无参数) |
以下是 () 的有效参数:engine``-e
- sqlite
- MySQL
- Postgresql