• 新手入门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)

  • 相关阅读:
    require.js+bootstrap实现简单的页面登录和页面跳转
    require.js疑惑
    汉子转拼音(不支持多音字)
    require.js入门
    CSS+transform画动态表情
    nodejs的简单爬虫
    根据选择的省市区自动匹配邮政编码
    node将excel内容转json
    js实现省市区联动
    sql server 作业收缩数据库
  • 原文地址:https://www.cnblogs.com/163yun/p/9881414.html
Copyright © 2020-2023  润新知