新手入门Sqlalchemy
此文已由作者尤炳棋授权网易云社区发布。
欢迎访问网易云社区,了解更多网易技术产品运营经验。
入职考拉半年多,一直在从事KLQA平台的开发,KLQA平台后端是用基于python的flask框架搭建的。Flask框架采用的数据库是sqlalchemy。Sqlalchemy是基于ORM技术的关系型数据库,上手非常快。在开发KLQA平台的这半年里,积累了一些Sqlalchemy的实战经验。
什么是ORM?
ORM是英文Object Relational Mapping的缩写,翻译成中文称为“对象关系映射”。通俗的来讲,ORM就是将数据库中的表映射为pyhon的类,这样对数据库的操作就可以转化成对类的操作,非常方便。
Sqlalchemy的安装
通过easy_install安装只需要输入easy_install sqlalchemy即可,如果是通过pip安装,命令是sudo pip install sqlalchemy,
连接数据库
为了连接数据库,我们可以新建一个python文件,比如我们新建config.py,在文件中设置SQLALCHEMY_DATABASE_URI 常量,声明ORM底层所用数据库的访问URL。
设置方式为SQLALCHEMY_DATABASE_URI=‘mysql://用户名:密码@数据库地址/数据库名称?charset=utf8’。还可以设置SQLALCHEMY_COMMIT_ON_TEARDOWN常量,
如果该常量为True,则每次请求结束后都会自动提交数据库中的变动。再用create_engine创建就行了。
创建映射类
比如我们用mysql语句创建了一张NewTable表,mysql语句如下:
CREATE TABLE ` NewTable` ( `id` int(10) NOT NULL AUTO_INCREMENT , `column1` text NULL , `column2` text NULL , `column3` varchar(1000) NULL , `column4` datetime NULL , PRIMARY KEY (`id`) );
则相应的映射类为:
class NewTable(db.Model): __tablename__ = 'weekly_report' id = db.Column(db.Integer, primary_key=True) column1 = db.Column(db.Text) column2 = db.Column(db.Text) column3 = db.Column(db.String) column4 = db.Column(db.DateTime, default=now()) def__init__(self,column1, column2, column3, column4): self.column1= major_item self.column2= major_project self.column3= report_remark self.column4= create_person
其中映射类要继承sqlalchemy中的Model类, __tablename__ 表示该类要映射的数据库表名,每一个表字段都映射到类中的成员变量。下面介绍一下数据库最基本的“增删改查”
查
如果我要查询column3等于我邮箱的记录,可以使用filter()方法
db.session.query(NewTable).filter(NewTable.column3 == youbingqi@corp.netease.com)
如果在后面加上.all()返回的是一个list,如果加上first()返回的是查询结果的第一条。
db.session.query(NewTable).filter(NewTable.column3 == youbingqi@corp.netease.com ).all(),将查询结果以list形式返回
db.session.query(NewTable).filter(NewTable.column3 == youbingqi@corp.netease.com ).first(),返回查询结果的第一条。
增
比如我要增加一条记录
new_record = NewTable(column1, column2, column3, column4) db.session.add(new_record) db.session.commit()
删
如果要删除所有column3等于我邮箱的记录,可以这样操作
db.session. query(NewTable).filter(NewTable.column3 == youbingqi@corp.netease.com).delete()
改
更改数据库中的记录可以用updata()方法,现在我们将数据库中所有创建人是我的记录进行更改
db.session. query(NewTable).filter(NewTable.column3 == youbingqi@corp. netease.com).updata({NewTable.column3 :”youbingqi”})
数据库联表查询
比如要查询JiraProjectTask表中,类型为“项目”的工程,工程的类型保存在JiraTask表中,所以要和JiraTask联表查询。如下联表查询结果返回的是两个列表,需要用两个变量来保存返回结果。第一个变量保存的是query()方法中第一个表的字段,第二个变量保存的是query()方法中第二个表的字段。
project_list, task_list = db.session.query(JiraProjectTask, JiraTask).filter(JiraTask.jira_key == JiraProjectTask.jira_key,JiraTask.jira_type == '项目').all()
其他常用方法:
or_ , 查询数据库是放入filter中表示筛选条件是或的关系。
.order_by,对查询结果按照某个字段进行排序。
.like(),模糊查询方法,方法中用%匹配多个字符。
.group_by, 对查询结果进行分组。
.count(),计算查询结果的个数,性能较差,不推荐使用,推荐使用all()返回list列表,再用len()方法求个数
总结:
Sqlalchemy是基于ORM的关系型数据库,将表和类进行相互映射,就是把数据库表的一行记录与一个对象互相做自动转换,通过对映射类进行操作就能对数据库进行变更,与mysqldb、pymysql这些没有采用ORM模型的数据库相比,操作上更方便简单,容易上手。
更多网易技术、产品、运营经验分享请点击。
相关文章:
【推荐】 wireshark抓包分析——TCP/IP协议
【推荐】 react技术栈实践(2)