新手入门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模型的数据库相比,操作上更方便简单,容易上手。


免费体验云安全(易盾)内容安全、验证码等服务

更多网易技术、产品、运营经验分享请点击



相关文章:
【推荐】 【RabbitMQ学习记录】-消息队列存储机制源码分析
【推荐】 网易郑栋:数据采集与分析的那些事——从数据埋点到AB测试


文章分类
后端