python之sqlalchemy模块
一、sqlalchemy简介
SQLAlchemy是Python编程语言下的一款开源软件。提供了SQL工具包及对象关系映射(ORM)工具,使用MIT许可证发行。SQLAlchemy“采用简单的Python语言,为高效和高性能的数据库访问设计,实现了完整的企业级持久模型”。SQLAlchemy的理念是,SQL数据库的量级和性能重要于对象集合;而对象集合的抽象又重要于表和行。因此,SQLAlchmey采用了类似于Java里Hibernate的数据映射模型,而不是其他ORM框架采用的Active Record模型。不过,Elixir和declarative等可选插件可以让用户使用声明语法。
SQLAlchemy与数据库关系图如下:
可以使用pip install sqlalchemy安装,安装完成后可以通过如下命令查看版本信息:
1import sqlalchemy
2sqlalchemy.__version__
二、连接数据库
在sqlalchemy中,session用于创建程序与数据库之间的会话。所有对象的载入和保存都需要通过session对象。示例代码如下:
1from sqlalchemy import create_engine
2from sqlalchemy.orm import sessionmaker
3# 链接数据库采用pymysq模块做映射,后面参数是最大连接数5
4ENGINE=create_engine("mysql+pymysql://[email protected]:3306/digchouti?charset=utf8", max_overflow=5)
5Session = sessionmaker(bind=engine)
6session = Session()
三、创建表
一个映射对应着一个Python类,用来表示一个表的结构。下面创建一个person表,包括id和name两个字段。也就是说创建表就是用python的的类来实现:
1import sqlalchemy
2from sqlalchemy import create_engine
3from sqlalchemy.ext.declarative import declarative_base
4from sqlalchemy import Column, Integer, String
5from sqlalchemy.orm import sessionmaker
6ENGINE=create_engine("mysql+pymysql://[email protected]:3306/digchouti?charset=utf8", max_overflow=5)
7#生成一个SQLORM基类,创建表必须继承他,别问我啥意思就是这么规定的
8Base = declarative_base()
9class Person(Base):
10 __tablename__ = 'userinfo'
11 id = Column(Integer, primary_key=True)
12 name = Column(String(32))
13 def __repr__(self):
14 return "<Person(name='%s')>" % self.name
此代码是创建了一个名字叫userinfo的表,表里有两列,一列是id,一列是name。
四、添加数据
当然我们创建了表,肯定也要添加数据,代码如下:
1#创建一个person对象
2person = Person(name='运维之路')
3#添加person对象,但是仍然没有提交到数据库
4session.add(person)
5#提交数据库
6session.commit()
7当然还能添加多条数据:
8session.add_all([
9 Person(name='运维之路'),
10 Person(name='361way.com')
11])
12session.commit()
五、查找数据
在sqlalchemy模块中,查找数据给提供了query()的方法 下面我就把能用到的给列举一下:
1#获取所有数据
2session.query(Person).all()
3#获取name=‘运维之路’的那行数据
4session.query(Person).filter(Person.name=='运维之路').one()
5#获取返回数据的第一行
6session.query(Person).first()
7#查找id大于1的所有数据
8session.query(Person.name).filter(Person.id>1).all()
9#limit索引取出第一二行数据
10session.query(Person).all()[1:3]
11#order by,按照id从大到小排列
12session.query(Person).ordre_by(Person.id)
13#equal/like/in
14query = session.query(Person)
15query.filter(Person.id==1).all()
16query.filter(Person.id!=1).all()
17query.filter(Person.name.like('%ay%')).all()
18query.filter(Person.id.in_([1,2,3])).all()
19query.filter(~Person.id.in_([1,2,3])).all()
20query.filter(Person.name==None).all()
21#and or
22from sqlalchemy import and_
23from sqlalchemy import or_
24query.filter(and_(Person.id==1, Person.name=='运维之路')).all()
25query.filter(Person.id==1, Person.name=='运维之路').all()
26query.filter(Person.id==1).filter(Person.name=='运维之路').all()
27query.filter(or_(Person.id==1, Person.id==2)).all()
28# count计算个数
29session.query(Person).count()
30# 修改update
31session.query(Person).filter(id > 2).update({'name' : '运维之路'})
32# 通配符
33ret = session.query(Users).filter(Users.name.like('e%')).all()
34ret = session.query(Users).filter(~Users.name.like('e%')).all()
35# 限制
36ret = session.query(Users)[1:2]
37# 排序
38ret = session.query(Users).order_by(Users.name.desc()).all()
39ret = session.query(Users).order_by(Users.name.desc(), Users.id.asc()).all()
40# 分组
41from sqlalchemy.sql import func
42ret = session.query(Users).group_by(Users.extra).all()
43ret = session.query(
44 func.max(Users.id),
45 func.sum(Users.id),
46 func.min(Users.id)).group_by(Users.name).all()
47ret = session.query(
48 func.max(Users.id),
49 func.sum(Users.id),
50 func.min(Users.id)).group_by(Users.name).having(func.min(Users.id) >2).all()
51# 连表
52ret = session.query(Users, Favor).filter(Users.id == Favor.nid).all()
53ret = session.query(Person).join(Favor).all()
54ret = session.query(Person).join(Favor, isouter=True).all()
55# 组合
56q1 = session.query(Users.name).filter(Users.id > 2)
57q2 = session.query(Favor.caption).filter(Favor.nid < 2)
58ret = q1.union(q2).all()
59q1 = session.query(Users.name).filter(Users.id > 2)
60q2 = session.query(Favor.caption).filter(Favor.nid < 2)
61ret = q1.union_all(q2).all()
查询这块比较多,可能写的不全还望各位见谅,剩下我相信大家都能扩展起来,上面的介绍完了,可能各位还不能吧融合到一块去,下面我给大家融合写在一块吧:
1from sqlalchemy.ext.declarative import declarative_base
2from sqlalchemy import Column
3from sqlalchemy import Integer, String, TIMESTAMP
4from sqlalchemy import ForeignKey, UniqueConstraint, Index
5from sqlalchemy.orm import sessionmaker, relationship
6from sqlalchemy import create_engine
7ENGINE=create_engine("mysql+pymysql://[email protected]:3306/digchouti?charset=utf8", max_overflow=5)
8Base = declarative_base()
9class Person(Base):
10 __tablename__ = 'userinfo'
11 id = Column(Integer, primary_key=True)
12 name = Column(String(32))
13 def __repr__(self):
14 return "<Person(name='%s')>" % self.name
15#创建连接数据库以供提交用,至此表会创建完成,可以去数据库里面查看
16Base.metadata.create_all(ENGINE)
17Session = sessionmaker(bind=engine)
18# 往里面插入多条数据
19session = Session()
20session.add_all([
21 Person(name='运维之路'),
22 Person(name='很cool')
23])
24session.commit()
六、sqlalchemy表关系之高级用法
上面阐述的是对于一张表的操作,下面将说的是表关系的一对多,多对多,了解数据库的都知道外键,也就是表关系建立。
1、一对多外键
第一种方法我们只用到普通的操作,这个方式相对于好理解,在第一张表创建完,插入数据然后要记得提交数据,然后往第二章表创建数据的时候,可以直接拿第一张相关联的数据,代码如下:
1#!/usr/bin/env python
2# -*- coding:utf-8 -*-
3from sqlalchemy.ext.declarative import declarative_base
4from sqlalchemy import Column,Integer,ForeignKey,UniqueConstraint,Index,String
5from sqlalchemy.orm import sessionmaker,relationship
6from sqlalchemy import create_engine
7engine=create_engine('mysql+pymysql://[email protected]:3306/db1')
8Base = declarative_base()
9class Son(Base):
10 __tablename__ = 'son'
11 id = Column(Integer,primary_key=True)
12 name = Column(String(32))
13 age = Column(String(32))
14 # 创建外键,对应父亲那张表的id项
15 father_id = Column(Integer,ForeignKey('father.id'))
16class Father(Base):
17 __tablename__ = 'father'
18 id = Column(Integer,primary_key=True)
19 name = Column(String(32))
20 age = Column(String(32))
21Base.metadata.create_all(engine)
22Session = sessionmaker(bind=engine)
23session = Session()
24f1 = Father(name = 'zhangyanlin',age = '18')
25session.add(f1)
26session.commit()
27w1 = Son(name = 'xiaozhang1',age = 3,father_id = 1)
28w2 = Son(name = 'xiaozhang2',age = 3,father_id = 1)
29session.add_all([w1,w2])
30session.commit()
2、一对多外键relationship
第二种方法和第一种一样,只是这里改用了relationship来做外键关系,代码如下:
1#!/usr/bin/env python
2# -*- coding:utf-8 -*-
3from sqlalchemy.ext.declarative import declarative_base
4from sqlalchemy import Column,Integer,ForeignKey,UniqueConstraint,Index,String
5from sqlalchemy.orm import sessionmaker,relationship
6from sqlalchemy import create_engine
7engine = create_engine('mysql+pymysql://[email protected]:3306/db1')
8Base = declarative_base()
9class Son(Base):
10 __tablename__ = 'son'
11 id = Column(Integer,primary_key=True)
12 name = Column(String(32))
13 age = Column(String(32))
14 father_id = Column(Integer,ForeignKey('father.id'))
15class Father(Base):
16 __tablename__ = 'father'
17 id = Column(Integer,primary_key=True)
18 name = Column(String(32))
19 age = Column(String(32))
20 son = relationship('Son')
21Base.metadata.create_all(engine)
22Session = sessionmaker(bind=engine)
23session = Session()
24f1 = Father(name = 'zhangyanlin',age = '18')
25w1 = Son(name = 'xiaozhang1',age = '3')
26w2 = Son(name = 'xiaozhang2',age = '4')
27# 重点是这里绑定关系
28f1.son = [w1,w2]
29# 只需要把父亲给传进去,儿子的自然就上传进去啦
30session.add(f1)
31session.commit()
捐赠本站(Donate)
如您感觉文章有用,可扫码捐赠本站!(If the article useful, you can scan the QR code to donate))
- Author: shisekong
- Link: https://blog.361way.com/python-sqlalchemy/6064.html
- License: This work is under a 知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议. Kindly fulfill the requirements of the aforementioned License when adapting or creating a derivative of this work.