SQLAlchemy总结+

Review:

一、Mysql 操作

创建一个test库
create database test;

授权一个用户
grant all privileges on *.* to 'asd'@'%' identified by 'awerfsdf123';

创建表
create table student(id int not null);

查询
select * from tabel_name where 条件1 and 条件2

增加
insert into table_name (id, name, age, sex, grander) values(1001, 'zhdya', 28, 'M', 99), (1002, 'ajing', 45, 'F', 86);

修改
update table_name set id=10 where 条件判断

删除
delete from table_name  where 条件判断
drop table table_name

联合查询
select a.id, b.name from A a join B b on a.id=b.tid

创建索引
create index idx_库名_表名_列名1_列名2 (列名1, 列名2)

查看sql是否走索引
explain select * from student where name='ling'

二、链接数据库

Python2 使用的是MySQLdb
python3 使用的pymysql  pip安装

操作

1. 创建链接和游标
注意:在mysql连接中,尽量使用一个连接,确保mysql的并发数
conn = pymysql.connect(host='192.168.161.161', port=3306, user='root', passwd='aaaaa', db='zhdya')
cus = conn.curse()

2. 执行sql
sql = "select * from Student;"
cus.execute(sql)
cus.fetchone()  获取单个  返回值  tuple
cus.fetchall()  获取多个  返回值  list(单个元素是tuple)
cus.fetchmany(size=n)  获取多个

3. 关闭游标和连接
cus.close()
conn.close()

注意结合 try... exception.... finally 的使用

SQLAlchemy

SQLAlchemy 是一种对象关系映射模型(Object Relational Mapper), 简称ORM。

它展现了一种将用户定义的python中的类映射到数据库中表的方法。类的实例,就相当于表中的一行数据。简单来说呢, 就是让我们从SQL语句中抽离出来,只需要按照python的语法来写, 它会自动转换为相对应的SQL语句。

python中的类 == 数据库中的表 
python中的类的属性 == 表中的字段 
python中类的实例 == 表中的行
1. 创建引擎
engine = create_engine('mysql+pymysql://username:password@hostname:port/db')
2. 创建session
DBsession = sessionmaker(bind=engine)
session = DBsession()
3.创建表
a. 获得engine
b. metadata = MetaData(engine)
c. student = Table('表名', metadata, Colume('id', Integer, primary_key=True), Colume('name', String(50))
d. metadata.create_all()
4.插入数据
a. 先要有一个模型 ★★★★★
Base = declarative_base()
class Student(Base):
    __tablename__ = 'student'
    id = Column(Integer, primary_key=True)
    name = Column(String(100), primary_key=True)

b. 导入模型类,实例化该类,
sutdent1 = Student(10001, 'zhang')

c. session.add(单实例)      session.add_all([实例1, 实例2])
5. 查询
filter和filter_by的区别:
filter:可以使用>  < 等,但是列必须是: 表.列,   filter的等于号是 ==
session.query(Student).filter(Student.id>100)
filter 不支持组合查询
session.query(Student).filter(Studnet.id>100).filter(name=='ling')

filter_by: 可以直接写列,不支持> <  filter_by 等于也是 ==
session.query(Student).filter_by(id==10)
filter_by 可以支持组合查询
session.query(Student).filter_by(name=='ling' and id=='342')

select * from student where name like '%zhdya%';
模糊查询含有zhdya的关键字

模糊查询
session.query(Student).filter(Student.name.like('%zhdya%'))

获取数据的时候有两个方法:
one()   tuple
all()   list(单个元素是tuple)
如果在查询中不写one(), 或者all()  出来的就是sql语句
6. 更新
1. 接着如上的先查出来
2. 更新一下类所对应的属性值就ok
3. session.commit()
student1 = session.query(Student).filter(Student.id==1001)
student1.name = "test"
session.commit()
7. 删除
1. 先查出来
2. 直接调用delete()方法就可以
3. 提交一下
8.统计, 分组,排序
统计:count()
只需要在查出来以后, 把one或者all替换成count()
统计有多少个

分组:group_by
查出来以后,把one或者all替换成group_by(属性)

三、牛刀小试

已经创建了一个 student 数据表:

mysql> desc student;
+---------+--------------+------+-----+---------+----------------+
| Field   | Type         | Null | Key | Default | Extra          |
+---------+--------------+------+-----+---------+----------------+
| id      | int(11)      | NO   | PRI | NULL    | auto_increment |
| age     | int(11)      | YES  |     | NULL    |                |
| sex     | varchar(100) | YES  |     | NULL    |                |
| address | varchar(100) | YES  |     | NULL    |                |
+---------+--------------+------+-----+---------+----------------+
4 rows in set (0.00 sec)

① 插入一些数据 insert

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time    : 2018/5/14 18:45
# @Author  : zhdya
# @File    : REVIEW22.py

from sqlalchemy import create_engine, Table, Column, Integer, MetaData, String
import pymysql
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker


Base = declarative_base()
class Student(Base):
    __tablename__ = 'student'
    id = Column('id', Integer, nullable=False, autoincrement=True, primary_key=True)
    age = Column('age', Integer)
    sex = Column('sex', String(100))
    address = Column('address', String(100))

def create(session):
    student11 = Student(id = 1001, age=23, sex='M', address='Suzhou')
    student22 = Student(id = 1002, age=28, sex='F', address='Xuzhou')
    session.add_all([student11,student22])
    session.commit()


def main():
    engine = create_engine("mysql+pymysql://root:[email protected]:3306/zhdya")
    DBsession = sessionmaker(bind=engine)
    session = DBsession()
    create(session)

if __name__ == '__main__':
    main()

查看结果:

mysql> select * from student;
+------+------+------+---------+
| id   | age  | sex  | address |
+------+------+------+---------+
| 1001 |   23 | M    | Suzhou  |
| 1002 |   28 | F    | Xuzhou  |
+------+------+------+---------+
2 rows in set (0.00 sec)

② 查询数据 query

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time    : 2018/5/14 18:45
# @Author  : zhdya
# @File    : REVIEW22.py

from sqlalchemy import create_engine, Table, Column, Integer, MetaData, String
import pymysql
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker


Base = declarative_base()
class Student(Base):
    __tablename__ = 'student'
    id = Column('id', Integer, nullable=False, autoincrement=True, primary_key=True)
    age = Column('age', Integer)
    sex = Column('sex', String(100))
    address = Column('address', String(100))

def create(session):
    student11 = Student(id = 1001, age=23, sex='M', address='Suzhou')
    student22 = Student(id = 1002, age=28, sex='F', address='Xuzhou')
    session.add_all([student11,student22])
    session.commit()

def query(session):
    aa = session.query(Student).filter(Student.address.like('%Suzhou%'))
    for i in aa:
        print(i.id)
        print(i.age)
        print(i.sex)
        print(i.address)

def main():
    engine = create_engine("mysql+pymysql://root:[email protected]:3306/zhdya")
    DBsession = sessionmaker(bind=engine)
    session = DBsession()
    # create(session)
    query(session)

if __name__ == '__main__':
    main()

输出:
1001
23
M
Suzhou

③ 更新数据 update

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time    : 2018/5/14 18:45
# @Author  : zhdya
# @File    : REVIEW22.py

from sqlalchemy import create_engine, Table, Column, Integer, MetaData, String
import pymysql
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker


Base = declarative_base()
class Student(Base):
    __tablename__ = 'student'
    id = Column('id', Integer, nullable=False, autoincrement=True, primary_key=True)
    age = Column('age', Integer)
    sex = Column('sex', String(100))
    address = Column('address', String(100))

def create(session):
    student11 = Student(id = 1001, age=23, sex='M', address='Suzhou')
    student22 = Student(id = 1002, age=28, sex='F', address='Xuzhou')
    session.add_all([student11,student22])
    session.commit()

def query(session):
    aa = session.query(Student).filter(Student.address.like('%Suzhou%'))
    for i in aa:
        print(i.id)
        print(i.age)
        print(i.sex)
        print(i.address)

def update(session):
    bb = session.query(Student).filter(Student.age == 23).one()
    bb.age = 22
    session.commit()

def main():
    engine = create_engine("mysql+pymysql://root:[email protected]:3306/zhdya")
    DBsession = sessionmaker(bind=engine)
    session = DBsession()
    # create(session)
    query(session)
    update(session)

if __name__ == '__main__':
    main()
    
查看更新的表字段:
mysql> select * from student;
+------+------+------+---------+
| id   | age  | sex  | address |
+------+------+------+---------+
| 1001 |   22 | M    | Suzhou  |
| 1002 |   28 | F    | Xuzhou  |
+------+------+------+---------+
2 rows in set (0.01 sec)

④ 删除数据 delete

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time    : 2018/5/14 18:45
# @Author  : zhdya
# @File    : REVIEW22.py

from sqlalchemy import create_engine, Table, Column, Integer, MetaData, String
import pymysql
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker


Base = declarative_base()
class Student(Base):
    __tablename__ = 'student'
    id = Column('id', Integer, nullable=False, autoincrement=True, primary_key=True)
    age = Column('age', Integer)
    sex = Column('sex', String(100))
    address = Column('address', String(100))

def create(session):
    student11 = Student(id = 1001, age=23, sex='M', address='Suzhou')
    student22 = Student(id = 1002, age=28, sex='F', address='Xuzhou')
    session.add_all([student11,student22])
    session.commit()

def query(session):
    aa = session.query(Student).filter(Student.address.like('%Suzhou%'))
    for i in aa:
        print(i.id)
        print(i.age)
        print(i.sex)
        print(i.address)

def update(session):
    bb = session.query(Student).filter(Student.age == 23).one()
    bb.age = 22
    session.commit()

def delete(session):
    session.query(Student).filter(Student.id >= 1002).delete()
    session.commit()

def main():
    engine = create_engine("mysql+pymysql://root:[email protected]:3306/zhdya")
    DBsession = sessionmaker(bind=engine)
    session = DBsession()
    # create(session)
    query(session)
    # update(session)
    delete(session)

if __name__ == '__main__':
    main()
    
查看数据:
mysql> select * from student;
+------+------+------+---------+
| id   | age  | sex  | address |
+------+------+------+---------+
| 1001 |   22 | M    | Suzhou  |
+------+------+------+---------+
1 row in set (0.00 sec)

⑤ 统计 count

我就不写全部的函数体了,就是如上的一层层:

def count(session):
    cc = session.query(Student).filter(Student.id >= 1002).count()
    print(cc)
    
输出:
3 (刚给我又重新插入了3条数据)

⑥ 排序 order_by && group_by

def groupBy(session):
    groupby = session.query(Student).group_by(Student.id).all()
    for i in groupby:
        print(i.id)

def orderBy(session):
    orderby = session.query(Student).order_by(Student.id.desc()).all()
    for j in orderby:
        print(j.id)
        
输出:
1001
1002
1022
1088
1088
1022
1002
1001

Ps:在使用order_by的时候使用了desc(), 意为:反序排序!!

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏xiaoxi666的专栏

Trie树/字典树题目(2017今日头条笔试题:异或)

关于trie数的其他应用,可参见http://www.cnblogs.com/dlutxm/archive/2011/10/26/2225660.html,感觉...

24530
来自专栏前端儿

一种排序

现在有很多长方形,每一个长方形都有一个编号,这个编号可以重复;还知道这个长方形的宽和长,编号、长、宽都是整数;现在要求按照一下方式排序(默认排序规则都是从小到大...

11820
来自专栏醉生梦死

MySQL常用函数 原

SELECT FROM_UNIXTIME(UNIX_TIMESTAMP(NOW()));

14120
来自专栏Java成神之路

PL/SQL学习笔记_01_基础:变量、流程控制

PL/SQL语句可以在Oracle客户端的 SQL窗口或者 command  窗口中运行

12120
来自专栏运维技术迷

MySQL数据库(三):数据类型

安装环境: 操作系统版本:RHEL 6.5 版本:MYSQL 5.5 常见的信息种类: 数值型:一般用于体重、身高、成绩、工资 字符型:一般用于...

39250
来自专栏阿杜的世界

MySQL文档阅读(一)-数字类型

MySQL支持很多系列的SQL数据类型:数字类型(numeric types)、日期和时间类型(date and time types)、字符串类型(字符和字节...

6410
来自专栏xingoo, 一个梦想做发明家的程序员

剑指OFFER之合并有序链表(九度OJ1519)

题目描述: 输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。 (hint: 请务必使用链表。) 输入: 输入可能包含...

20680
来自专栏IT杂记

Mapreduce程序中reduce的Iterable参数迭代出是同一个对象

今天在对reduce的参数Iterable进行迭代时,发现一个问题,即Iterator的next()方法每次返回的是同一个对象,next()只是修改了Writa...

21250
来自专栏CodingToDie

MySql Hash 索引

Hash 索引结构的特殊性,其检索效率非常高,索引的检索可以一次定位,不像B-Tree 索引需要从根节点到枝节点,最后才能访问到页节点这样多次的IO访问,所以 ...

33630
来自专栏黑白安全

Mysql索引类型Btree和Hash的区别以及使用场景

遇到单表数据量大的时候很多开发者都会想到给相对的字段建立索引来提高性能(mysql索引的使用),但很少会去关注索引的类型该如何选择,在mysql中支持有两种类型...

29730

扫码关注云+社区

领取腾讯云代金券