代码改变世界

uliweb数据库分析

2009-09-22 13:53  ubunoon  阅读(626)  评论(0编辑  收藏  举报

Uliweb数据库分析

Uliweb的数据库并不支持绑定功能,因此,可以自由配置,在配置数据库之前,需要自己先将数据库绑定,与模板一样,数据库绑定工作在app下的__init__.py文件中进行,而不是教程中说的setting.py(该文件在最新版本中已经修改为setting.ini)文件

 

与模板一样,也是通过decorator修饰符进行插入点调用,通过plugin函数进行调用,一个具体的例子如下:

import os

database= "%s" %os.path.join( os.path.dirname(os.path.abspath(__file__)), "database.db")

connection = {"connection": "sqlite:///%s" %database}

 

DEBUG_LOG = True

 

@plugin("startup")

def startup(sender):

    from uliweb import orm

    orm.set_debug_query(DEBUG_LOG)

    orm.set_auto_bind(True)

    orm.set_auto_migrate(True)

    orm.get_connection(**connection)

 

 

首先需要设置数据库连接参数,通过connection字典来设置连接,其中connection字典中的connection属性是必需的,对应于一个数据库连接字符串。mysql连接字符串的基本格式为:

provider://username:password@localhost:port/dbname?argu1=value1&argu2=value2

Sqlite连接字符串格式为:

Sqlite_db = create_engine("sqlite:///absoulte_path/database.db")

或者

Sqlite_db = create_engine("sqlite://")  == sqlite://:memory:  表示在内存中创建数据库

 

uliweb调用到startup时,会自动调用相关插件的函数,这是decorator赋予python的特性!每个调用者均有自己的参数,每个插件函数的第一个参数都是调用者对象,一般用sender来表示,该sender是一个

uliweb.core.SimpleFrame.Dispatcher对象。

 

Uliweb会自动查找每个app下面的__init__进行数据库配置处理,可以在每个app下面的__init__.py问及爱你写自己的配置参数,一旦在一个地方设定了,就是全局生效了。

 

set_debug_query(DEBUG_LOG)用来设置显示底层SQL,在开发服务器环境下,在命令行中显示,这对于出现错误时进行调试是非常方便的。

 

set_auto_bind(True)表示自动绑定,当你导入一个Model时,自动将与缺省的数据库进行绑定设置,就可以直接使用了,在单数据库连接时可以打开,在使用多数据库链接时应该关闭,然后手工绑定处理,如何处理,limodou没有说!

 

set_auto_migrate(True)表示如果运行时表格还不存在,则uliweb将自动创建表格,uliweb目前只能够处理:增加,删除,修改等情况,对于修改操作,可能会造成数据丢失,因此需要注意!因为现在无法判断字段的改名,所以一旦改名,就是删除旧的,创建新的,因此数据会丢失。Limodou认为采用数据备份,然后通过恢复程序来恢复数据库是最安全的,不过uliweb并没有这类工具。

采用自动迁移使得开发时用户不必考虑修改表结构的工作,只要改了就会生效,会非常方便的。

 

get_connection(**connection)将创建数据库链接对象,并根据上面的设定进行必要的初始化操作,因此get_connection必须放在所有数据库配置的最后面调用,调用完后,创建的连接将作为缺省连接提供全局使用。

 

数据库表格在uliweb中通过ormModel来实现

请看下面的代码:

from uliweb.orm import *

import datetime

 

class Login(Model):

    userName = Field(str)

    passWord = Field(str)

dateTime = Field(datetime.datetime, auto)

先从uliweb.orm中载入所有需要的模块,包括Model,然后通过派生Model类得到自己的表格类。

 

Uliweborm在定义model时支持两种方式:python内部方式和GAE方式

通过字典类型来进行匹配的。在使用时可以用Field(str,required=True)来转换成GAE形式的类型。

Python内部类型

GAE类型(Property

 

int

IntegerProperty

 

float

FloatProperty

 

unicode

UnicodeProperty

 

datetime.datetime

DateTimeProperty

 

datetime.time

TimeProperty

 

datetime.date

DateProperty

 

decimal.Decimal

DecimalProperty

 

str

StringProperty

 

bool

BooleanProperty

 

blob

BlobProperty

扩展类型

text

TextProperty

扩展类型

每个字段具有各种属性,常用属性为:

default 缺省值

max_length 最大值

verbose_name 提示信息

Python字段类型与GAE字段类型可以混合使用!

 

 

uliweb为你的Model创建表格的时候,会自动为你添加一个id,该字段是Model的主键

 

系统会在你使用Model 的时候,会自动为你创建数据库,因此,比不需要担心数据库的创建问题(对于sqlite),对于mysql,则系统会自动进行连接操作。

 

Model通过put方法来保存数据(也可以通过save方法来保存数据),注意数据是通过字典方式来保存的,字典的键值必须要与Model中定义的名称完全一直,否则会插入一个None对象,一般情况下,Model中定义的表格是通过POST方法来加入的,通过GET方法来获取的。

 

可以通过下面的方式来查看model具有那些方法?

 

Model一般具有以下几个方法:

序号

名字

说明

是否类方法

备注

1

all

 

 

2

bind

 

 

3

count

 

属性

4

create

 

 

5

delete

 

×

方法

6

filter

 

方法

7

get

 

方法

8

id

 

 

属性 已经被移除

9

is_saved

 

×

 

10

mro

 

 

已经被移除

11

property

 

 

已经被移除

12

put

 

×

方法,同save

13

remove

 

 

14

save

 

×

 

15

tablename

 

 

已经被移除

16

to_dict

 

×

 

17

以及用户在Model派生中定义的内容

 

这些方法的介绍:

count(cls, condition=None, **kwargs)表示获取符合某个条件的数量

bind(cls, metadata=None, auto_create=False) 用来创建数据库表格,当原表与旧表不同时,对原表进行删除

all(cls) 取出数据库中所有的内容

create(cls) 创建数据库表格

delete(self) 删除数据库中某个实例自身在数据库中的数据

filter(cls, condition=None, **kwargs) 过滤符合条件的

get(cls, condition=None, **kwargs) 得到符合条件的

is_saved(self) 该数据类型是否已经在数据库中保存了

put(self) 保存数据库对象,同save(self)方法

remove(cls, condition=None, **kwargs) 移走数据库中符合条件的数据

to_dict(self) 将自身数据转换为字典类型

__repr__(self) 数据库对象可以直接用print进行输出