orator

安装

pip install orator

文档

https://orator-orm.com/docs/

Orator文档不是很完整,不过可以结合Laravel和ThinkPHP文档,思想和操作基本一致
(英文)https://laravel.com/docs/5.8/database
(中文)https://www.kancloud.cn/manual/thinkphp5/135176

和Laravel一样,支持三种操作方式:
1、Query
2、Query Builder
3、ORM

一、配置

测试使用的表

CREATE TABLE `student` (`id` int(11) NOT NULL AUTO_INCREMENT,`name` varchar(20) NOT NULL DEFAULT '' COMMENT '姓名',`age` tinyint(3) unsigned NOT NULL DEFAULT '0' COMMENT '年龄',`sex` tinyint(3) unsigned NOT NULL DEFAULT '0' COMMENT '性别',`created_at` int(11) NOT NULL DEFAULT '0' COMMENT '创建时间',`updated_at` int(11) NOT NULL DEFAULT '0' COMMENT '修改时间',PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8mb4 COMMENT='学生表'

1、设置查询日志,打印sql

import logginglogger = logging.getLogger('orator.connection.queries')
logger.setLevel(logging.DEBUG)formatter = logging.Formatter('%(elapsed_time)s ms %(query)s')handler = logging.StreamHandler()
handler.setFormatter(formatter)logger.addHandler(handler)

2、配置数据库连接参数

from orator import DatabaseManager# 配置支持多个数据库连接,支持读写分离
config = {'default': 'mysql','mysql': {'read': [{'host': 'localhost'}],'write': [{'host': 'localhost'}],'driver': 'mysql','database': 'data','user': 'root','password': '123456','prefix': '','log_queries': True,  # 开启日志'use_qmark': True,    # 使用 ? 替代变量}
}db = DatabaseManager(config)

二、Query

1、读操作


# select return list
results = db.select('select * from student where id = ?', [2])
print(results)
# ({'id': 2, 'name': '李白', 'age': 24, 'sex': 1, 'created_at': 1575127010, 'updated_at': 1575187008},)

2、写操作

# insert return int
result = db.insert('insert into student (age, name) values (?, ?)', [23, 'John'])
print(result)
# 1# update return int
result = db.update('update student set age = 10 where name = ?', ['John'])
print(result)
# 1# delete return int
result = db.delete('delete from student where id = ?', [132])
print(result)
# 1

3、表操作和事务

# statement
result = db.statement('drop table student')
print(result)
# 0# 执行事务
with db.transaction():db.table('student').update({'age': 1})# db.table('posts').delete()

三、Query Builder

1、select

# select all row from table
users = db.table('student').get()
# 'SELECT * FROM `student`'for user in users:print(user['name'])  # 或者 user.name# chunk 每次获取5个
for users in db.table('student').chunk(5):print('==')for user in users:print(user['name'])# 获取single row(None) from a table
user = db.table('student').where('name', 'John').first()
"SELECT * FROM `student` WHERE `name` = 'John' LIMIT 1"
print(user['name'])# 返回single column from a row
user = db.table('student').where('name', 'John').pluck('name')
"SELECT `name` FROM `student` WHERE `name` = 'John' LIMIT 1"
print(user)# 返回 某列值的列表
sql = db.table('student').lists('name')
'SELECT `name` FROM `student`'
print(list(sql))# 返回一个字典列表
roles = db.table('student').lists('age', 'name')
print(roles)
'SELECT `age`, `name` FROM `student`'
# {'John': 1}# select
users = db.table('student').select('name', 'age').get()
# 'SELECT `name`, `age` FROM `student`'users = db.table('student').distinct().get()
# 'SELECT DISTINCT * FROM `student`'users = db.table('student').select('name as user_name').get()
# 'SELECT `name` AS `user_name` FROM `student`'# where
users = db.table('student').where('age', '>', 25).get()
# 'SELECT * FROM `student` WHERE `age` > 25'users = db.table('student').where('age', '>', 25).or_where('name', '--"John').get()
# 'SELECT * FROM `student` WHERE `age` > 25 OR `name` = \'--\\"John\''users = db.table('student').where_between('age', [25, 35]).get()
# 'SELECT * FROM `student` WHERE `age` BETWEEN 25 AND 35'users = db.table('student').where_not_between('age', [25, 35]).get()
# 'SELECT * FROM `student` WHERE `age` NOT BETWEEN 25 AND 35'users = db.table('student').where_in('id', [1, 2, 3]).get()
# 'SELECT * FROM `student` WHERE `id` IN (1, 2, 3)'users = db.table('student').where_not_in('id', [1, 2, 3]).get()
# 'SELECT * FROM `student` WHERE `id` NOT IN (1, 2, 3)'users = db.table('student').where_null('updated_at').get()
# 'SELECT * FROM `student` WHERE `updated_at` IS NULL'query = db.table('student').select('age').order_by('age')
query.group_by('age')
query.having('age', '>', 100)users = query.get()
# SELECT `age` FROM `student` GROUP BY `age` HAVING `age` > 100 ORDER BY `age` ASC'

2、 insert

db.table('student').insert(name='Tom', age=12)
# "INSERT INTO `student` (`name`, `age`) VALUES ('Tom', 12)"db.table('student').insert({'name': 'Tom','age': 13
})
# "INSERT INTO `student` (`name`, `age`) VALUES ('Tom', 13)"uid = db.table('student').insert_get_id({'name': 'Tom','age': 13
})
# "INSERT INTO `student` (`age`, `name`) VALUES (13, 'Tom')"db.table('student').insert([{'name': 'Tom', 'age': 13},{'name': 'Tom', 'age': 14}
])
# "INSERT INTO `student` (`age`, `name`) VALUES (13, 'Tom'), (14, 'Tom')"

3、update

db.table('student').where('id', 1).update(age=1)
# 'UPDATE `student` SET `age` = 1 WHERE `id` = 1'db.table('student').where('id', 1).update({'age': 1})
# 'UPDATE `student` SET `age` = 1 WHERE `id` = 1'

4、increment /decrement

db.table('student').increment('age')  # Increment the value by 1
'UPDATE `student` SET `age` = `age` + 1'db.table('student').increment('age', 5)  # Increment the value by 5
'UPDATE `student` SET `age` = `age` + 5'db.table('student').decrement('age')  # Decrement the value by 1
'UPDATE `student` SET `age` = `age` - 1'db.table('student').decrement('age', 5)  # Decrement the value by 5
'UPDATE `student` SET `age` = `age` - 5'db.table('student').increment('votes', 1, name='John')
# TypeError: increment() got an unexpected keyword argument 'name'db.table('student').increment('age', 1, {'name': 'John'})
"UPDATE `student` SET `age` = `age` + 1, `name` = 'John'"

5、delete

db.table('student').where('age', '<', 25).delete()
# 'DELETE FROM `student` WHERE `age` < 25'db.table('student').delete()
'DELETE FROM `student`'db.table('student').truncate()
'TRUNCATE `student`'

四、Model

定义model

from orator import Model, SoftDeletesModel.set_connection_resolver(db)class User(SoftDeletes, Model):# 设置真正的表名__table__ = 'student'# 设置可以批量赋值的字段__fillable__ = ['name', 'age']# 设置不允许赋值字段__guarded__ = ['id']# 禁用时间自动更新 created_at updated_at__timestamps__ = False# 需要继承 SoftDeletes 使用软删除, 好像不起作用__dates__ = ['deleted_at']

1、select

users = User.all()
'SELECT * FROM `student`'user = User.find(1)
'SELECT * FROM `student` WHERE `student`.`id` = 1 LIMIT 1'# 如果没有抛出异常
model = User.find_or_fail(1)model = User.where('age', '>', 100).first_or_fail()
'SELECT * FROM `student` WHERE `age` > 100 LIMIT 1'users = User.where('age', '>', 100).take(10).get()
'SELECT * FROM `student` WHERE `age` > 100 LIMIT 10'count = User.where('age', '>', 100).count()
'SELECT COUNT(*) AS aggregate FROM `student` WHERE `age` > 100'# 使用原样查询
users = User.where_raw('id > ? and age = 100', [25]).get()
'SELECT * FROM `student` WHERE id > 25 AND age = 100'# 分次取回数据
for users in User.chunk(100):for user in users:pass

2 insert

# Save新增数据
user = User()
user.name = 'John'
user.save()
"INSERT INTO `student` (`name`) VALUES ('John')"# Create
user = User.create(name='John')
"INSERT INTO `student` (`name`) VALUES ('John')"# 查询数据,如果不存在则创建一条数据
user = User.first_or_create(name='Jini')
"SELECT * FROM `student` WHERE (`name` = 'Jini') LIMIT 1"
"INSERT INTO `student` (`name`) VALUES ('Jini')"# 查询数据,如果不存在则创建一个实例
user = User.first_or_new(name='java')
"SELECT * FROM `student` WHERE (`name` = 'java') LIMIT 1"

3、 Update

# find ->save
user = User.find(14)
'SELECT * FROM `student` WHERE `student`.`id` = 14 LIMIT 1'
user.name = 'Foo'user.save()
"UPDATE `student` SET `name` = 'Foo' WHERE `id` = 14"# update
User.where('age', '>', 100).update(name='Jack')
"UPDATE `student` SET `name` = 'Jack' WHERE `age` > 100"

4、 delete

# find -> delete
user = User.find(14)
# 'SELECT * FROM `student` WHERE `student`.`id` = 14 LIMIT 1'
user.delete()
# 'DELETE FROM `student` WHERE `id` = 14'User.destroy(15)
'SELECT * FROM `student` WHERE `id` IN (15)'
'DELETE FROM `student` WHERE `id` = 15'User.destroy(16, 17, 18)
'SELECT * FROM `student` WHERE `id` IN (16, 17, 18)'
'DELETE FROM `student` WHERE `id` = 16'
'DELETE FROM `student` WHERE `id` = 17'
'DELETE FROM `student` WHERE `id` = 18'User.where('age', '>', 100).delete()
'DELETE FROM `student` WHERE `age` > 100'# User.where('id', '=', 19).delete()
'DELETE FROM `student` WHERE `id` = 19'# 使用软删除后,查询结果没有删除后的数据
phone = User.find(20)
'SELECT * FROM `student` WHERE (`student`.`id` = 20) AND (`student`.`deleted_at` IS NULL) LIMIT 1'# 包含软删除后的数据
User.with_trashed().where('id', 1).get()
'SELECT * FROM `student` WHERE `id` = 1'

五、Model关联查询

引入模块

from orator import ModelModel.set_connection_resolver(db)from orator.orm import (has_one,belongs_to,has_many,belongs_to_many,has_many_through,morph_to,morph_one,morph_many,morph_to_many, morphed_by_many)

1、一对一


"""
student <- -> phonestudentid - integer    name - stringphoneid - integernumber - stringstudent_id - integer
"""class Student(Model):# 设置真正的表名__table__ = 'student'# 指定外键@has_one('student_id')def phone(self):return Phoneclass Phone(Model):# 指定本表中的外键字段@belongs_to('student_id')def student(self):return Studentphone = Student.find(20).phone
'SELECT * FROM `student` WHERE `student`.`id` = 20 LIMIT 1'print(phone)
'SELECT * FROM `phones` WHERE `phones`.`student_id` = 20 LIMIT 1'ret = Phone.find(1).student
'SELECT * FROM `phones` WHERE `phones`.`id` = 1 LIMIT 1'
print(ret)
'SELECT * FROM `student` WHERE `student`.`id` = 20 LIMIT 1'

2、一对多

"""
student <- => comment表结构和一对一样,查询的时候没有limit 1限制studentid - integer    name - stringcommentid - integername - stringstudent_id - integer
"""class Student(Model):# 设置真正的表名__table__ = 'student'@has_many('student_id', 'id')def comments(self):return Commentclass Comment(Model):# 定义反向关系@belongs_todef student(self):return Studentcomments = Student.find(20).comments
print(comments)
'SELECT * FROM `student` WHERE `student`.`id` = 20 LIMIT 1'
'SELECT * FROM `comments` WHERE `comments`.`student_id` = 20'print(Comment.find(1).student)
'SELECT * FROM `comments` WHERE `comments`.`id` = 1 LIMIT 1'
'SELECT * FROM `student` WHERE `student`.`id` = 20 LIMIT 1'

3、多对多

"""
student <- => roles_student <= -> rolesstudentid - integer    name - stringrolesid - integername - stringroles_studentid - integerrole_id - integerstudent_id - integer"""class Student(Model):# 设置真正的表名__table__ = 'student'@belongs_to_manydef roles(self):return Roleclass Role(Model):@belongs_to_manydef students(self):return Studentroles = Student.find(20).roles
print(roles)'SELECT * FROM `student` WHERE `student`.`id` = 1 LIMIT 1'"""
SELECT `roles`. *, `roles_student`.
`student_id` AS `pivot_student_id`,
`roles_student`. `role_id` AS `pivot_role_id`
FROM `roles` INNER JOIN `roles_student`
ON `roles`. `id` = `roles_student`. `role_id`WHERE `roles_student`. `student_id` = 20"""print(Role.find(1).students)'SELECT * FROM `roles` WHERE `roles`.`id` = 1 LIMIT 1'"""
SELECT `student`. *, `roles_student`.
`role_id` AS `pivot_role_id`,
`roles_student`. `student_id` AS `pivot_student_id`
FROM `student` INNER JOIN `roles_student`
ON `student`. `id` = `roles_student`. `student_id`
WHERE `roles_student`. `role_id` = 1
"""

4、跨中间表一对多

"""
countries <- => students <- => rolescountriesid - integername - stringstudentsid - integername - stringcountry_id - integerrolesid - integertitle - stringstudent_id - integer"""class Student(Model):# 设置真正的表名__table__ = 'student'@has_manydef roles(self):return Roleclass Role(Model):@belongs_todef students(self):return Studentclass Country(Model):__table__ = 'countrys'# 定义反向关系@has_many_through(Student, 'country_id', 'student_id')def roles(self):return Roleprint(Country.find(1).roles)'SELECT * FROM `countrys` WHERE `countrys`.`id` = 1 LIMIT 1'"""
SELECT `roles`.*, `student`.`country_id` FROM `roles`
INNER JOIN `student` ON `student`.`id` = `roles`.`student_id`
WHERE `student`.`country_id` = 1
"""

六、Model多态关联

1、多态一对一关联
和一对一关系相比,多了一个type类型字段,标记多个表


# 一个模型属于一个模型
"""
Staff <- -> Photo
Order <- -> Photo staffid - integername - stringordersid - integerprice - integerphotosid - integerpath - stringimageable_id - integerimageable_type - string"""
from orator.orm import morph_one, morph_toclass Photo(Model):@morph_todef imageable(self):returnclass Staff(Model):@morph_one('imageable')def photo(self):return Photoclass Order(Model):# 重写多态关联字段__morph_name__ = 'order'@morph_one('imageable')def photo(self):return Photostaff = Staff.find(1)
'SELECT * FROM `staffs` WHERE `staffs`.`id` = 1 LIMIT 1'print(staff.photo)
"""
SELECT * FROM `photos`
WHERE `photos`.`imageable_id` = 1
AND `photos`.`imageable_type` = 'staffs'
LIMIT 1
"""photo = Photo.find(1)
'SELECT * FROM `photos` WHERE `photos`.`id` = 1 LIMIT 1'

2、多态一对多关联
没有和多态一对多相比,没有limit

from orator.orm import morph_to, morph_many
"""
# 一个模型属于多个模型Staff <- => Photo
Order <- => Photo  staffid - integername - stringordersid - integerprice - integerphotosid - integerpath - stringimageable_id - integerimageable_type - string
"""class Photo(Model):@morph_todef imageable(self):returnclass Staff(Model):@morph_many('imageable')def photos(self):return Photoclass Order(Model):# 重写多态关联字段__morph_name__ = 'order'@morph_many('imageable')def photos(self):return Photostaff = Staff.find(1)
'SELECT * FROM `staffs` WHERE `staffs`.`id` = 1 LIMIT 1'for photo in staff.photos:pass"""SELECT * FROM `photos`
WHERE `photos`.`imageable_id` = 1
AND `photos`.`imageable_type` = 'staffs'photo = Photo.find(1)
'SELECT * FROM `photos` WHERE `photos`.`id` = 1 LIMIT 1'imageable = photo.imageable
print(imageable)
# 'SELECT * FROM `staffs` WHERE `staffs`.`id` = 1 LIMIT 1'
"""

3、多态多对多

"""
postsid - integername - stringvideosid - integername - stringtagsid - integername - stringtaggablestag_id - integertaggable_id - integertaggable_type - string"""
from orator.orm import morph_to_many,  morphed_by_manyclass Tag(Model):@morphed_by_many('taggable')def posts(self):return Post@morphed_by_many('taggable')def videos(self):return Videoclass Post(Model):@morph_to_many('taggable')def tags(self):return Tagclass Video(Model):@morph_to_many('taggable')def tags(self):return Tagprint(Video.find(1).tags)'SELECT * FROM `videos` WHERE `videos`.`id` = 1 LIMIT 1'"""
SELECT `tags`.*,
`taggables`.`taggable_id` AS `pivot_taggable_id`,
`taggables`.`tag_id` AS `pivot_tag_id`
FROM `tags` INNER JOIN `taggables`
ON `tags`.`id` = `taggables`.`tag_id`
WHERE `taggables`.`taggable_id` = 1
AND `taggables`.`taggable_type` = 'videos'
"""

七、其他操作

1、动态属性


from orator import Model, SoftDeletesModel.set_connection_resolver(db)class Student(Model):# 设置真正的表名__table__ = 'student'@has_many('student_id', 'id')def comments(self):return Commentclass Comment(Model):# 定义反向关系@belongs_todef student(self):return Studentprint(Student.find(1).comments.count())
'SELECT * FROM `student` WHERE `student`.`id` = 1 LIMIT 1'
'SELECT * FROM `comments` WHERE `comments`.`student_id` = 1'
# 2# 增加条件查询
print(Student.find(1).comments().where('id', '>', 1).first())
'SELECT * FROM `student` WHERE `student`.`id` = 1 LIMIT 1'
'SELECT * FROM `comments` WHERE `comments`.`student_id` = 1 AND `id` > 1 LIMIT 1'

2、预加载数据


from orator import Model, SoftDeletesModel.set_connection_resolver(db)class Student(Model):# 设置真正的表名__table__ = 'student'@has_many('student_id', 'id')def comments(self):return Commentclass Comment(Model):# 定义反向关系@belongs_todef student(self):return Studentfor comment in Comment.all():print(comment.student.name)"""
'SELECT * FROM `comments`'
'SELECT * FROM `student` WHERE `student`.`id` = 1 LIMIT 1'
'SELECT * FROM `student` WHERE `student`.`id` = 1 LIMIT 1'
'SELECT * FROM `student` WHERE `student`.`id` = 2 LIMIT 1'
"""# 预加载 解决  N + 1  次查询问题for comment in Comment.with_('student').get():print(comment.student.name)"""
'SELECT * FROM `comments`'
'SELECT * FROM `student` WHERE `student`.`id` IN (1, 2)'
"""# 增加查询条件
Comment.with_({'student': Student.query().where('id', '>', 1)
}).get()"""
'SELECT * FROM `comments`'
'SELECT * FROM `student` WHERE `student`.`id` IN (1, 2) AND `id` > 1'
"""# load加载
comments = Comment.all()
comments.load('student')
'SELECT * FROM `comments`'
'SELECT * FROM `student` WHERE `student`.`id` IN (1, 2)'# 添加条件
comments.load({'student': Student.query().where('name', 'like', '%foo%')
})
"SELECT * FROM `student` WHERE `student`.`id` IN (1, 2) AND `name` like '%foo%'"

3、插入关联数据


Model.set_connection_resolver(db)class Student(Model):# 设置真正的表名__table__ = 'student'@has_many('student_id', 'id')def comments(self):return Commentclass Comment(Model):__fillable__ = ['number']__timestamps__ = False# 定义反向关系@belongs_todef student(self):return Student# 插入一条关联数据
comment = Comment(number='A new comment')student = Student.find(1)
'SELECT * FROM `student` WHERE `student`.`id` = 1 LIMIT 1'comment = student.comments().save(comment)
"INSERT INTO `comments` (`number`, `student_id`) VALUES ('A new comment', 1)"# 插入多条关联数据
comments = [Comment(number='Comment 1'),Comment(number='Comment 2'),Comment(number='Comment 3')
]student = student.find(1)student.comments().save_many(comments)
"""
"INSERT INTO `comments` (`number`, `student_id`) VALUES ('Comment 1', 1)"
"INSERT INTO `comments` (`number`, `student_id`) VALUES ('Comment 2', 1)"
"INSERT INTO `comments` (`number`, `student_id`) VALUES ('Comment 3', 1)"
"""# create方法
student = Student.find(1)
student.comments().create(number="123")
'SELECT * FROM `student` WHERE `student`.`id` = 1 LIMIT 1'
"INSERT INTO `comments` (`number`, `student_id`) VALUES ('123', 1)"

4、一对多关系维护

from orator import Model, SoftDeletesModel.set_connection_resolver(db)class Student(Model):# 设置真正的表名__table__ = 'student'@has_many('student_id', 'id')def comments(self):return Commentclass Comment(Model):__fillable__ = ['number']__timestamps__ = False# 定义反向关系@belongs_todef student(self):return Student# belongs_to 关系更新
comment = Comment.find(1)
student = Student.find(22)# # 添加关系
comment.student().associate(student)
comment.save()"""
'SELECT * FROM `comments` WHERE `comments`.`id` = 1 LIMIT 1'
'SELECT * FROM `student` WHERE `student`.`id` = 22 LIMIT 1'
'UPDATE `comments` SET `student_id` = 22 WHERE `id` = 1'
"""# 解除关系
comment.student().dissociate()
comment.save()
'UPDATE `comments` SET `student_id` = NULL WHERE `id` = 1'

5、多对多关系维护


from orator import Model, SoftDeletesModel.set_connection_resolver(db)class Student(Model):# 设置真正的表名__table__ = 'student'@belongs_to_manydef roles(self):return Roleclass Role(Model):@belongs_to_manydef students(self):return Studentuser = Student.find(1)
role = Role.find(1)# 添加关联
user.roles().attach(role)"""
'SELECT * FROM `student` WHERE `student`.`id` = 1 LIMIT 1'
'SELECT * FROM `roles` WHERE `roles`.`id` = 1 LIMIT 1''INSERT INTO `roles_student` (`role_id`, `student_id`) VALUES (1, 1)'
"""# 解除关联
# user.roles().detach(1)
'DELETE FROM `roles_student` WHERE `student_id` = 1 AND `role_id` IN (1)'# 同步关系
user.roles().sync([1, 2, 3])
"""
'SELECT `role_id` FROM `roles_student` WHERE `student_id` = 1''DELETE FROM `roles_student` WHERE `student_id` = 1 AND `role_id` IN (NULL)''INSERT INTO `roles_student` (`role_id`, `student_id`) VALUES (1, 1)'
'INSERT INTO `roles_student` (`role_id`, `student_id`) VALUES (2, 1)'
'INSERT INTO `roles_student` (`role_id`, `student_id`) VALUES (3, 1)'
"""

6、修改时间字段格式


class User(Model):def get_date_format(self):return 'DD-MM-YY'

7、scope重用查询

class Student(Model):# 设置真正的表名__table__ = 'student'@scopedef popular(self, query):return query.where('age', '>', 100)@scopedef women(self, query, sex='womem'):return query.where('sex', sex)users = Student.popular().women().order_by('created_at').get()
"SELECT * FROM `student` WHERE (`age` > 100) AND (`sex` = 'womem') ORDER BY `created_at` ASC"

8、accessor、mutator


from orator import Model, SoftDeletes
from orator.orm import scope, accessor, mutatorModel.set_connection_resolver(db)# scope重用查询
class Student(Model):# 设置真正的表名__table__ = 'student'__timestamps__ = False# 设置序列化字段__hidden__ = ['created']__visible__ = ['name', 'age', 'is_man']# 添加额外字段__appends__ = ['is_man']# 类型自动转换# 支持 int, float, str, bool, dict, list.__casts__ = {'age': 'str'}sex_map = {0: '女',1: '男'}# 访问器@accessordef get_sex(self):sex = self.get_raw_attribute('sex')sex_map = {0: '女',1: '男'}return sex_map.get(sex)# 设置器@mutatordef set_sex(self, value):sex_map_reverse = {v: k for k, v in self.sex_map.items()}self.set_raw_attribute('sex', sex_map_reverse.get(value, 1))@accessordef is_man(self):return self.get_raw_attribute('sex') == 1# users = Student.popular().women().order_by('created_at').get()
"SELECT * FROM `student` WHERE (`age` > 100) AND (`sex` = 'womem') ORDER BY `created_at` ASC"# print(Student.find(1).first_name)
'SELECT * FROM `student` WHERE `student`.`id` = 1 LIMIT 1'
# Johnstudent = Student.find(1)
# student.set_first_name = 'JAcK'
# student.save()
print(student.get_sex)
student.set_sex = '男'
print(type(student.age)) # <class 'str'>
student.save()print(student.to_json())
{"name": "1", "age": "0"}print(student.serialize())
{'name': '1', 'age': '0'}# 添加额外字段后输出
{'name': '1', 'age': '0', 'is_man': True}

9、Pagination分页

users = db.table('student').paginate(15, 2)
'SELECT COUNT(*) AS aggregate FROM `student`'
'SELECT * FROM `student` LIMIT 15 OFFSET 15'
print(dir(users))
"""
[
'count', 'current_page', 'current_page_resolver',
'first_item', 'get_collection', 'has_more_pages',
'has_pages', 'is_empty', 'items', 'last_item',
'last_page', 'next_page', 'per_page', 'previous_page',
'resolve_current_page', 'serialize',
'to_dict', 'to_json', 'total'
]
"""# 转换为json数据
print(users.to_json())
"""
[
{"id": 35, "name": "John", "age": 0, "sex": 0, "created_at": 0, "updated_at": 0, "deleted_at": null, "country_id": null},
{"id": 36, "name": "John", "age": 0, "sex": 0, "created_at": 0, "updated_at": 0, "deleted_at": null, "country_id": null}
]
"""
some_users = Student.where('age', '>', 100).paginate(15, 2)
'SELECT COUNT(*) AS aggregate FROM `student` WHERE `age` > 100'
'SELECT * FROM `student` WHERE `age` > 100 LIMIT 15 OFFSET 15'# simple-paginationret = Student.simple_paginate(15, 2)
'SELECT * FROM `student` LIMIT 16 OFFSET 15'
print(dir(ret))
"""
['count', 'current_page', 'current_page_resolver', 'first_item',
'get_collection', 'has_more_pages', 'has_pages', 'is_empty', 'items',
'last_item', 'next_page', 'per_page', 'previous_page', 'resolve_current_page',
'serialize', 'to_dict', 'to_json']
"""

Python:orator-orm操作实践相关推荐

  1. python之ORM操作

    1. SQLalchemy简介 SQLAlchemy是一个开源的SQL工具包,基本Python编程语言的MIT许可证而发布的对象关系映射器.SQLAlchemy提供了"一个熟知的企业级全套持 ...

  2. Python+django网页设计入门(7):常用ORM操作

    前导课程: Python+django网页设计入门(6):文件上传与数据导入 Python+django网页设计入门(5):自定义用户注册与登录功能 Python+django网页设计入门(4):用户 ...

  3. 西游之路——python全栈——Django之ORM操作

    Django之ORM操作 前言 Django框架功能齐全自带数据库操作功能,本文主要介绍Django的ORM框架 到目前为止,当我们的程序涉及到数据库相关操作时,我们一般都会这么搞: 创建数据库,设计 ...

  4. python生日快乐代码_【震惊小伙伴的单行代码—Python篇】的实践操作

    偶然间在实验楼上看到一篇文章[震惊小伙伴的单行代码-Python篇],觉得还蛮有趣的,所以就想看看,但是我自己的电脑没有python环境,所以就直接利用实验楼上的在线python环境对文章里的10个单 ...

  5. python 软件工程_软件工程实践之 django/python

    outline 本文包括以下内容:outline django: 一个搭建后端服务的工具箱.framework: django vs flask/tornado/spring/laravel rest ...

  6. ORM操作models一对多、多对多关系

    ORM操作 单表.一对多表操作 1 from django.db import models 2 3 4 class UserGroup(models.Model): 5 title = models ...

  7. Django ORM操作

    Django ORM操作 一般操作 看专业的官网文档,做专业的程序员! 必知必会13条 <1> all(): 查询所有结果<2> get(**kwargs): 返回与所给筛选条 ...

  8. 第十八 django及ORM操作

    一.项目及ORM操作 1.添加新项目 python manage.py startapp blog 2.配置数据库类 models.py from django.db import models# C ...

  9. Django 之ORM操作

    1.什么是ORM? 全称关系对象映射Object Relational Mapping(简称ORM),是通过描述面向对象与数据库之间的对应的元数据,将对象持久化的更新到数据库中. 有了ORM,就不需要 ...

最新文章

  1. AI一分钟 | 阿里云放大招要揽1000名AI人才,川普AI守国论遭遇54名科学家反对
  2. 25个常用Matplotlib图的Python代码,收藏收藏!
  3. JAVA关于字符串字符数组处理的小题目
  4. Exchange2003表单和OWA选项中更改密码设置
  5. PP模块快速入门之功能简介(二)
  6. shell脚本中使用seq生成连续整数
  7. 谈谈即时通讯开发平台
  8. css文件修改后没变化 static_Go Web编程使用Go语言创建静态文件服务器
  9. 机器学习之线性回归(matlab)
  10. oracle pl/sql之oracle存储过程
  11. C++ 深拷贝和浅拷贝std::move移动构造函数,移动赋值函数
  12. 7.1 pdo 宝塔面板php_腾讯云服务器建站系列 – 熟练宝塔面板部署网站/快速安装HTTPS加密...
  13. RLS算法Matlab实现
  14. Oracle表分区合并
  15. 基于微信小程序的学院通知与文件分享系统app设计与实现-计算机毕业设计源码+LW文档
  16. 手把手Neo4j教程,超全!!!
  17. 苹果公司战略管理分析
  18. U3D2018打包FaceBook SDK11
  19. 应届实习生 北京短租租房记
  20. 网站推广策略-网站推广120种实用方法_打杂的_新浪博客

热门文章

  1. 怎样理解最小二乘法原理及其用途
  2. java基于ssm的在线家电维修系统网站
  3. 撬开多线程的大门——学习多线程必须掌握的基本概念
  4. 字节跳动提前批Android客户端(四面+HR面),最终Offer等到手,我也太难了吧
  5. 《闻香识女人》观后感 之 总有希望存在——中外电影的粗浅看法
  6. 什么是容器(docker)
  7. B1084 外观数列(python)
  8. xilinx项目XDMA/PCIE高速传输解决方案传输效率90%
  9. 便利贴--33{uniapp中提示音的处理,动态输出}
  10. 内网渗透-实战|手把手教你如何进行内网渗透