新手入门Sqlalchemy

本文分享了在KLQA平台开发中使用SQLAlchemy的实战经验,包括安装、数据库连接、映射类创建及基本的增删改查操作,展示了ORM技术如何简化数据库操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

此文已由作者尤炳棋授权网易云社区发布。

欢迎访问网易云社区,了解更多网易技术产品运营经验。


入职考拉半年多,一直在从事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测试


The SQLAlchemy Object Relational Mapper presents a method of associating user-defined Python classes with database tables, and instances of those classes (objects) with rows in their corresponding tables. It includes a sys- tem that transparently synchronizes all changes in state between objects and their related rows, called a unit of work, as well as a system for expressing database queries in terms of the user defined classes and their defined relationships between each other. The ORM is in contrast to the SQLAlchemy Expression Language, upon which the ORM is constructed. Whereas the SQL Expression Language, introduced in SQL Expression Language Tutorial, presents a system of representing the primitive constructs of the relational database directly without opinion, the ORM presents a high level and abstracted pattern of usage, which itself is an example of applied usage of the Expression Language. While there is overlap among the usage patterns of the ORM and the Expression Language, the similarities are more superficial than they may at first appear. One approaches the structure and content of data from the perspective of a user-defined domain model which is transparently persisted and refreshed from its underlying storage model. The other approaches it from the perspective of literal schema and SQL expression representations which are explicitly composed into messages consumed individually by the database. A successful application may be constructed using the Object Relational Mapper exclusively. In advanced situations, an application constructed with the ORM may make occasional usage of the Expression Language directly in certain areas where specific database interactions are required. The following tutorial is in doctest format, meaning each >>> line represents something you can type at a Python command prompt, and the following text represents the expected return value.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值