peewee创建mysql_python ORM 模块peewee(一): 建立数据库对象

1. 单连接模式

peewee通过Database类及其子类来建立数据库对象,目前peewee支持的数据库有Postgres, MySQL,MySQL,SQLite 以及BerkeleyDB。这里我们仅通过MySQL来进行了解,如果对其他数据库类型的相关内容感兴趣可以参见官方文档。

mysql通过MySQLDatabase类来初始化数据库对象,这是Database的一个子类,继承了父类的构造函数:

class Database(database[, threadlocals=True[, autocommit=True[, fields=None[, ops=None[, autorollback=False[, use_speedups=True[, **connect_kwargs]]]]]]])

这里

database指数据库的名称, 字符串格式

threadlocals指 是否用本地线程保存连接

autocommit 自动提交

fields 添加orm中的数据类型到数据库中数据类型的映射

ops 定义操作符映射

autorollback 执行数据库请求时出错则自动回滚

use_speedups 用Cpython speedup模块来加速某些queries

connect_kwargs 数据库驱动中初始化所用的key

另外, MySQLDatabase类还添加了以下选项:

commit_select = True

compound_operations = ['UNION']

for_update = True

subquery_delete_same_table = False

peewee中的mysql驱动有两个pymysql和MySQLdb,但是从源码中可以看到peewee是更倾向于使用MySQLdb的,只有当import MySQLdb as mysql报错后才会开始引用import pymysql as mysql。这里举例介绍一些常用的connect_kwargs,如果需要详细了解,可以参见源程序中的connections.connection类,里面的注释已经写得非常清晰了。例如:

#! /usr/bin/env python

# coding: utf-8

from peewee import *

db = MySQLDatabase(

database = 'test',# string

passwd = 'test', # string

user = 'test', # string

host = 'localhost', # string

port = 3306, # int, 可不写

)

官方文档中建议使用数据库前先调用其db.connect()函数,这个函数功能上并不是必须的,但是可以帮助定位错误。

实例化本地数据库还有另外一种方法: mysql://user:passwd@ip:port/my_db这在Connecting using a Database URL中也有介绍

2 实时数据库实例化

Database类中的database字段可以先设置为None, 数据库的实例化可以在随后得到数据可靠名字之后,具体操作如下:

db = MySQLDatabase(None)

# 此时若是调用db.connect()则会报错

# 数据库的名字

db_name = 'mydb'

db.init(

database = 'mydb',

host = 'test',

user = 'test',

passwd = 'test'

)

3 动态实例化

peewee甚至允许数据库的动态实例化,这里用到了代理模式:

# 创建数据库的代理

db_proxy = Proxy()

# 使用代理数据库创建表

class BaseModel(Model):

class Meta:

database = db_proxy

class User(BaseModel):

username = CharField()

# 根据配置条件来选择不同的数据库

if app.config['DEBUG']:

db= SqliteDatabase('local.db')

elif app.config['TESTING']:

db= SqliteDatabase(':memory:')

else:

db= PostgresqlDatabase('mega_production_db')

# 通过代理来根据配置条件将选取的数据库初始化

database_proxy.initialize(db)

4 连接池

peewee为通过一个'PooledDatabase'基类Mysql, sqlite 和Postgres 提供了连接池的功能。这个基类的定义如下:

class PooledDatabase(database[, max_connections=20[, stale_timeout=None[, **kwargs]]])

其中:

max_connections 定义了最大连接数

stale_timeout 定义了每个连接最大可用时间

具体它的MySQL子类为:class PooledMySQLDatabase

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值