链接数据库

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