SQLAlchemy是 Python 编程语言下的一款开源软件。提供了SQL工具包及 对象关系映射 (ORM)工具,使用 MIT许可证 发行。
SQLAlchemy“采用简单的Python语言,为高效和高性能的数据库访问设计,实现了完整的企业级持久模型”。SQLAlchemy的理念是, SQL数据库 的量级和性能重要于对象集合;而对象集合的抽象又重要于表和行。因此,SQLAlchmey采用了类似于 Java 里 Hibernate 的数据映射模型,而不是其他ORM框架采用的Active Record模型。不过,Elixir和declarative等可选插件可以让用户使用声明语法。
SQLAlchemy与数据库关系图如下:
安装完后查看版本信息
import sqlalchemy sqlalchemy.__version__
在sqlalchemy中,session用于创建程序与数据库之间的会话。所有对象的载入和保存都需要通过session对象。
from sqlalchemy import create_engine from sqlalchemy.orm import sessionmaker # 链接数据库采用pymysq模块做映射,后面参数是最大连接数5 ENGINE=create_engine("mysql+pymysql://root@127.0.0.1:3306/digchouti?charset=utf8", max_overflow=5) Session = sessionmaker(bind=engine) session = Session()
一个映射对应着一个Python类,用来表示一个表的结构。下面创建一个person表,包括id和name两个字段。也就是说创建表就是用python的的类来实现
import sqlalchemy from sqlalchemy import create_engine from sqlalchemy.ext.declarative import declarative_base from sqlalchemy import Column, Integer, String from sqlalchemy.orm import sessionmaker ENGINE=create_engine("mysql+pymysql://root@127.0.0.1:3306/digchouti?charset=utf8", max_overflow=5) #生成一个SQLORM基类,创建表必须继承他,别问我啥意思就是这么规定的 Base = declarative_base() class Person(Base): __tablename__ = 'userinfo' id = Column(Integer, primary_key=True) name = Column(String(32)) def __repr__(self): return "<Person(name='%s')>" % self.name
此代码是创建了一个名字叫userinfo的表,表里有两列,一列是id,一列是name。
当然我们创建了表,肯定也要添加数据,代码如下:
#创建一个person对象 person = Person(name='张岩林') #添加person对象,但是仍然没有提交到数据库 session.add(person) #提交数据库 session.commit()
当然还能添加多条数据:
session.add_all([ Person(name='张岩林'), Person(name='aylin') ]) session.commit()
在sqlalchemy模块中,查找数据给提供了query()的方法 下面我就把能用到的给列举一下:
#获取所有数据 session.query(Person).all() #获取name=‘张岩林’的那行数据 session.query(Person).filter(Person.name=='张岩林').one() #获取返回数据的第一行 session.query(Person).first() #查找id大于1的所有数据 session.query(Person.name).filter(Person.id>1).all() #limit索引取出第一二行数据 session.query(Person).all()[1:3] #order by,按照id从大到小排列 session.query(Person).ordre_by(Person.id) #equal/like/in query = session.query(Person) query.filter(Person.id==1).all() query.filter(Person.id!=1).all() query.filter(Person.name.like('%ay%')).all() query.filter(Person.id.in_([1,2,3])).all() query.filter(~Person.id.in_([1,2,3])).all() query.filter(Person.name==None).all() #and or from sqlalchemy import and_ from sqlalchemy import or_ query.filter(and_(Person.id==1, Person.name=='张岩林')).all() query.filter(Person.id==1, Person.name=='张岩林').all() query.filter(Person.id==1).filter(Person.name=='张岩林').all() query.filter(or_(Person.id==1, Person.id==2)).all() # count计算个数 session.query(Person).count() # 修改update session.query(Person).filter(id > 2).update({'name' : '张岩林'})
查询这块比较多,可能写的不全还望各位见谅,剩下我相信大家都能扩展起来
上面的介绍完了,可能各位还不能吧融合到一块去,下面我给大家融合写在一块吧:
from sqlalchemy.ext.declarative import declarative_base from sqlalchemy import Column from sqlalchemy import Integer, String, TIMESTAMP from sqlalchemy import ForeignKey, UniqueConstraint, Index from sqlalchemy.orm import sessionmaker, relationship from sqlalchemy import create_engine ENGINE=create_engine("mysql+pymysql://root@127.0.0.1:3306/digchouti?charset=utf8", max_overflow=5) Base = declarative_base() class Person(Base): __tablename__ = 'userinfo' id = Column(Integer, primary_key=True) name = Column(String(32)) def __repr__(self): return "<Person(name='%s')>" % self.name #创建连接数据库以供提交用,至此表会创建完成,可以去数据库里面查看 Base.metadata.create_all(ENGINE) Session = sessionmaker(bind=engine) # 往里面插入多条数据 session = Session() session.add_all([ Person(name='张岩林'), Person(name='很帅') ]) session.commit()
上面阐述的是对于一张表的操作,下面将说的是表关系的一对多,多对多,了解数据库的都知道外键,也就是表关系建立。
1、一对多外键(1)
第一种方法我们只用到普通的操作,这个方式相对于好理解,在第一张表创建完,插入数据然后要记得提交数据,然后往第二章表创建数据的时候,可以直接拿第一张相关联的数据,代码如下:
#!/usr/bin/env python # -*- coding:utf-8 -*- from sqlalchemy.ext.declarative import declarative_base from sqlalchemy import Column,Integer,ForeignKey,UniqueConstraint,Index,String from sqlalchemy.orm import sessionmaker,relationship from sqlalchemy import create_engine engine=create_engine('mysql+pymysql://root@127.0.0.1:3306/db1') Base = declarative_base() class Son(Base): __tablename__ = 'son' id = Column(Integer,primary_key=True) name = Column(String(32)) age = Column(String(32)) # 创建外键,对应父亲那张表的id项 father_id = Column(Integer,ForeignKey('father.id')) class Father(Base): __tablename__ = 'father' id = Column(Integer,primary_key=True) name = Column(String(32)) age = Column(String(32)) Base.metadata.create_all(engine) Session = sessionmaker(bind=engine) session = Session() f1 = Father(name = 'zhangyanlin',age = '18') session.add(f1) session.commit() w1 = Son(name = 'xiaozhang1',age = 3,father_id = 1) w2 = Son(name = 'xiaozhang2',age = 3,father_id = 1) session.add_all([w1,w2]) session.commit()
2、一对多外键(2)relationship
第二种方法和第一种一样,只是这里改用了relationship来做外键关系,代码如下:
#!/usr/bin/env python # -*- coding:utf-8 -*- from sqlalchemy.ext.declarative import declarative_base from sqlalchemy import Column,Integer,ForeignKey,UniqueConstraint,Index,String from sqlalchemy.orm import sessionmaker,relationship from sqlalchemy import create_engine engine = create_engine('mysql+pymysql://root@127.0.0.1:3306/db1') Base = declarative_base() class Son(Base): __tablename__ = 'son' id = Column(Integer,primary_key=True) name = Column(String(32)) age = Column(String(32)) father_id = Column(Integer,ForeignKey('father.id')) class Father(Base): __tablename__ = 'father' id = Column(Integer,primary_key=True) name = Column(String(32)) age = Column(String(32)) son = relationship('Son') Base.metadata.create_all(engine) Session = sessionmaker(bind=engine) session = Session() f1 = Father(name = 'zhangyanlin',age = '18') w1 = Son(name = 'xiaozhang1',age = '3') w2 = Son(name = 'xiaozhang2',age = '4') # 重点是这里绑定关系 f1.son = [w1,w2] # 只需要把父亲给传进去,儿子的自然就上传进去啦 session.add(f1) session.commit()