执行SQL语句并处理结果
创建或修改数据库对象
为了开始使用模型,必须先打开到数据库的连接并创建表。
peewee将运行必要的CREATE TABLE
查询,另外创建任何约束和索引。
class Person(Model):
name = CharField(index=False,column_name='name1')
birthday = DateField(null=True)
is_relative = BooleanField()
class Meta:
database = db
#创建表
Person.create_table()
# 创建多个可以在列表后面加
# database.create_tables([Person])
创建表后,如果选择修改数据库架构(通过添加、删除或更改列),则需要:
删除表并重新创建。
运行一个或多个
ALTER TABLE
查询。peewee附带了一个模式迁移工具,可以大大简化这一过程。
删除数据库对象
删除数据库对象时使用drop_tables()函数,可以删除给定模型列表的表、索引和相关元数据。
db.drop_tables([Person])
导出数据库对象
1、如果模型已经存在数据库中,则直接通过python -m pwiz
批量创建Model。
指定postgres,用户为vbadmin,host为127.0.0.1,数据库为test。
python -m pwiz -e postgres -u vbadmin -H 127.0.0.1 --password test > testModel.py
2、输入密码,pwiz脚本会自动创建Model,内容如下:
from peewee import *
database = PostgresqlDatabase('test', **{'host': 127.0.0.1, 'user': vbadmin, 'password': ''})
class UnknownField(object):
def __init__(self, *_, **__): pass
class BaseModel(Model):
class Meta:
database = database
class Person(BaseModel):
birthday = DateField()
is_relative = IntegerField()
name = CharField()
class Meta:
table_name = 'person'
执行更新
插入
插入数据很简单。我们可以指定数据insert() 以四种不同的方式:
直接添加一条数据。
p = Person(name='lcg', birthday=date(1990, 12, 20), is_relative=True) p.save()
直接create,create之后还会返回创建的这条数据,方便进行其他操作。
p= Person.create(name='yyy', birthday=date(2004, 2, 7), is_relative=True)
使用属性作为参数。
p = Person.insert(name='zzz', birthday=date(2001,12,2), is_relative=False).execute()
使用列属性和值映射。
Note.insert({ Person.name: 'meow', Person.birthday: datetime.datetime.now(), Person.relative: True}).execute()
更新
query = Person.update(name="zzz").where(Person.is_relative=True)
query.execute()
删除
删除不接受任何参数。
删除所有在00年前出生的人的信息,返回删除个数。
n = Person.delete().where(Person.birthday< datetime.date(2000, 1, 1)).execute()
因为删除(和更新)查询不支持联接,所以可以使用子查询根据相关表中的值删除行。下面是如何删除is_relative为“False”的所有人的信息的示例:
获取is_relative=False的人的id。
people = Person.select(Person.id).where(Person.is_relative == False)
删除前面获取到的ID的信息。
Person.delete().where(Person.id.in_(people)).execute()
执行查询
查询单条数据
调用SQL语句查询,get的括号中给定条件,可以一次性多个条件。
people= Person.get(Person.name == 'yyy', is_relative == False)
查询多条数据
保留is_relative的名字。
people= Person.select(Person.name).where(Person.is_relative==True)
获取结果
遍历数组
select方法获取到的结果可以顺序遍历以获取结果集中所有结果。
for i in people: print(i.name)
执行存储过程
下面的例子展示了如何调用存储过程。
sql_procedure = " CREATE OR REPLACE PROCEDURE pro_test(a integer,inout b integer) as \ begin \ b := a+b; \ end" cursor = db.excute_sql(sql_procedure) cursor = db.excute_sql("call pro_test(1,5)") for value, in cursor: print(value)
下面的例子展示了如何调用函数。
sql_function = "CREATE OR REPLACE FUNCTION func_test (a int,out b int) RETURNS int AS \ $$ \ begin \ b := a+2; \ return ; \ end; \ $$ LANGUAGE 'plpgsql';" cursor = db.excute_sql(sql_function) cursor = db.excute_sql("select func_test(1)") for value, in cursor: print(value)
处理数据类型
二进制类型
Vastbase G100提供两种不同的方法存储二进制数据。二进制数据可以使用二进制数据类型 BYTEA存储在表中,或者使用大对象特性以一种特殊的格式将二进制数据存储在一个独立的表中,然后通过在表中保存一个类型为OID的值来引用该表。以下为BYTEA类型使用示例。
1、创建表。
class ImageData(Model): image = BlobField(default=b'emptydata') class Meta: database = db ImageData.create_table()
2、插入数据。
data = bytes(range(256)) i = ImageData(image=data) i.save()
3、读取数据。
i2 = ImageData.get(i.id) assert i2.image.tobytes() == data ImageData.create(image = b'string') assert ImageData.select(ImageData.image).where(ImageData.image == b'string').count()==1
字符类型
Vastbase G100中TEXT类型与VARCHAR类型都是可变长的字符类型,区别在于VARCHAR类型通过VARCHAR(n)中的n来限制最大长度,而TEXT类型没有。TEXT类型与VARCHAR类型几乎没有性能差别,TEXT类型最多可存储1G数据。
1、创建表。
class String1(Model): col1 = TextField()# text类型 col2 = CharField()# varchar类型 class Meta: database = db String1.create_table()
2、插入数据。
a='test1' b='test2' s = String1(col1=a,col2=b) s.save()
3、读取数据。
s1 = String1.get(1) assert s1.col1==a assert s1.col2==b
数字类型
数字类型有整数类型、任意精度数字类型、浮点类型和序数类型。下面用整数类型integer、任意精度数字类型numeric和double precision举例说明。
1、创建表。
class Number1(Model): col1 = IntegerField()# integer类型 col2 = DecimalField()# numeric类型 col3 = DoubleField()# double precision类型 class Meta: database = db Number1.create_table()
2、插入数据。
a = 1 b= decimal.Decimal(2.141) c = 3.1415926 n = Number1(col1=a,col2=b,col3=c) n.save() 3)读取数据 n1=Number1.get(1) print(n1.col1) print(n1.col2) print(n1.col3)
时间/日期类型
日期/时间类型有timestamp 、date、time 、interval。
下面以timestamp 、date、time 举例说明。
1、创建表。
class DateTime1(Model): col1 = DateTimeField() # timestamp类型 col2 = DateField() # date类型 col3 = TimeField() # time类型 class Meta: database = db DateTime1.create_able()
2、插入数据。
_now = datetime.now().replace(microsecond = 0) d = DateTime1(col1=_now,col2=_now,col3=_now.time()) d.save()
3、读取数据。
dt1=DateTime1.get(1) assert isinstance(dt1.col1,datetime) assert isinstance(dt1.col2,date) assert isinstance(dt1.col3,time)