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


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

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



    相关文章:
    【推荐】 使用QUIC
    【推荐】 年轻设计师如何做好商业设计

  • 相关阅读:
    HDU 5492 Find a path
    codeforce gym 100548H The Problem to Make You Happy
    Topcoder SRM 144 Lottery
    codeforce 165E Compatible Numbers
    codeforce gym 100307H Hack Protection
    区间DP总结
    UESTC 1321 柱爷的恋爱 (区间DP)
    HDU 4283 You Are the One (区间DP)
    HDU 2476 String painter (区间DP)
    UESTC 426 Food Delivery (区间DP)
  • 原文地址:https://www.cnblogs.com/zyfd/p/9881416.html
Copyright © 2011-2022 走看看