zoukankan      html  css  js  c++  java
  • uliweb数据库分析

    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进行输出

  • 相关阅读:
    我决定潜心研究技术了...
    new proxy
    谷歌插件开发
    js计算不准确 解决方案
    netty中如何切包
    Spring Boot的ComponentScan原理
    解决org.yaml.snakeyaml.scanner.ScannerException: while scanning for the next token found character '@'
    深入理解js立即执行函数
    winform 将子窗体显示在父窗体的TabControl控件上
    js隐藏网页元素
  • 原文地址:https://www.cnblogs.com/ubunoon/p/uliweb_database.html
Copyright © 2011-2022 走看看