当前位置:Gxlcms > 数据库问题 > ORM框架之SQLAlchemy

ORM框架之SQLAlchemy

时间:2021-07-01 10:21:17 帮助过:21人阅读

一、SQLAlchemy的简介

SQLAlchemy是Python编程语言下的一款ORM框架,该框架建立在数据库API之上,使用关系对象映射进行数据库操作,简言之便是:将对象转换成SQL,然后使用数据API执行SQL并获取执行结果。

技术分享

二、SQLAlchemy的初步应用---表的创建

1、单表的创建与删除

  1. #!/usr/bin/env python<br># -*- coding:utf-8 -*-<br>#Author:ye<br><br>#导入模块<br>from sqlalchemy.ext.declarative import declarative_base<br>from sqlalchemy import Column, Integer, String, ForeignKey, UniqueConstraint, Index<br>from sqlalchemy.orm import sessionmaker, relationship<br>from sqlalchemy import create_engine<br>import time<br><br>#创建继承类Base(规定的写法)<br>Base = declarative_base()<br><br>#创建类,并继承父类Base<br>class User(Base):<br> #创建表,“__talbename__”后的值代表数据库表名<br> __tablename__ = ‘user‘<br> #创建数据库表的列字段<br> id = Column(Integer,primary_key=True,autoincrement=True)<br> name = Column(String(32))<br> age = Column(Integer)<br><br> #创建索引<br> __table_args__ = (<br> UniqueConstraint(‘id‘, ‘name‘, name=‘uix_id_name‘),<br> Index(‘uix_id_name‘, ‘name‘)<br> )<br><br>def init_db():<br> #创建引擎,并在此基础上通过pymysql插件,连接数据库。同时创建数据库连接池,设置为5<br> engine = create_engine("mysql+pymysql://root:oldboy@192.168.159.134:3306/day15?charset=utf8", max_overflow=5)<br><br> #找到所有继承Base这个类的子类,并创建子类中定义的所有的数据库表<br> Base.metadata.create_all(engine)<br><br><br>def drop_db():<br> # 创建引擎,并在此基础上通过pymysql插件,连接数据库。同时创建数据库连接池,设置为5<br> engine = create_engine("mysql+pymysql://root:oldboy@192.168.159.134:3306/day15?charset=utf8", max_overflow=5)<br><br> # 找到所有继承Base这个类的子类,并删除子类中定义的所有的数据库表<br> Base.metadata.drop_all(engine)<br><br>#执行函数,创建数据库表<br>init_db()<br>time.sleep(1)<br>print("数据库表创建成功!")<br><br>#执行函数,删除数据库表<br>drop_db()<br>time.sleep(1)<br>print("数据库表删除成功!")

2、一对多 

  1. #!/usr/bin/env python<br># -*- coding:utf-8 -*-<br>#Author:ye<br><br>#导入模块<br>from sqlalchemy.ext.declarative import declarative_base<br>from sqlalchemy import Column, Integer, String, ForeignKey, UniqueConstraint, Index<br>from sqlalchemy.orm import sessionmaker, relationship<br>from sqlalchemy import create_engine<br>import time<br><br>#创建继承类Base(规定的写法)<br>Base = declarative_base()<br><br>class Favor(Base):<br> __tablename__ = ‘favor‘<br> nid = Column(Integer, primary_key=True)#设置为主键<br> caption = Column(String(50), default=‘red‘, unique=True)#默认值为red,设置为唯一约束<br><br><br>class Person(Base):<br> __tablename__ = ‘person‘<br> nid = Column(Integer, primary_key=True)#设置为主键<br> name = Column(String(32), index=True, nullable=True)#可以为空<br> favor_id = Column(Integer, ForeignKey("favor.nid"))#设置外键,person.favor.id = favor.id
  1. <br>#创建引擎,并在此基础上通过pymysql插件,连接数据库。同时创建数据库连接池,设置为5<br>engine = create_engine("mysql+pymysql://root:oldboy@192.168.159.134:3306/day15?charset=utf8", max_overflow=5)<br><br>#找到所有继承Base这个类的子类,并创建子类中定义的所有的数据库表<br>Base.metadata.create_all(engine)

3、多对多

  1. #!/usr/bin/env python<br># -*- coding:utf-8 -*-<br>#Author:ye<br><br>#导入模块<br>from sqlalchemy.ext.declarative import declarative_base<br>from sqlalchemy import Column, Integer, String, ForeignKey, UniqueConstraint, Index<br>from sqlalchemy.orm import sessionmaker, relationship<br>from sqlalchemy import create_engine<br>import time<br><br>#创建继承类Base(规定的写法)<br>Base = declarative_base()<br><br># 多对多<br>class Group(Base):<br> __tablename__ = ‘group‘<br> id = Column(Integer, primary_key=True)<br> name = Column(String(64), unique=True, nullable=False)<br><br>class Server(Base):<br> __tablename__ = ‘server‘<br><br> id = Column(Integer, primary_key=True, autoincrement=True)<br> hostname = Column(String(64), unique=True, nullable=False)<br> port = Column(Integer, default=22)<br><br><br>class ServerToGroup(Base):<br> __tablename__ = ‘servertogroup‘<br> nid = Column(Integer, primary_key=True, autoincrement=True)<br> server_id = Column(Integer, ForeignKey(‘server.id‘))#设置外键 servertogroup.server_id = server.id<br> group_id = Column(Integer, ForeignKey(‘group.id‘))#设置外键 servertogroup.group_id = group.id<br><br><br>def init_db():<br> # 创建引擎,并在此基础上通过pymysql插件,连接数据库。同时创建数据库连接池,设置为5<br> engine = create_engine("mysql+pymysql://root:oldboy@192.168.159.134:3306/day15?charset=utf8", max_overflow=5)<br> # 找到所有继承Base这个类的子类,并创建子类中定义的所有的数据库表<br> Base.metadata.create_all(engine)<br><br><br>def drop_db():<br> # 创建引擎,并在此基础上通过pymysql插件,连接数据库。同时创建数据库连接池,设置为5<br> engine = create_engine("mysql+pymysql://root:oldboy@192.168.159.134:3306/day15?charset=utf8", max_overflow=5)<br><br> # 找到所有继承Base这个类的子类,并删除子类中定义的所有的数据库表<br> Base.metadata.drop_all(engine)<br><br># 执行函数,创建数据库表<br>init_db()<br>time.sleep(1)<br>print("数据库表创建成功!")<br><br>#执行函数,删除数据库表<br>drop_db()<br>time.sleep(1)<br>print("数据库表删除成功!")

三、SQLAlchemy的进一步应用---表的操作

1、添加数据

  1. #!/usr/bin/env python<br># -*- coding:utf-8 -*-<br>#Author:ye<br><br>#导入模块<br>from sqlalchemy.ext.declarative import declarative_base<br>from sqlalchemy import Column, Integer, String, ForeignKey, UniqueConstraint, Index<br>from sqlalchemy.orm import sessionmaker, relationship<br>from sqlalchemy import create_engine<br><br>#创建继承类Base(规定的写法)<br>Base = declarative_base()<br><br>#创建类,并继承父类Base<br>class User(Base):<br> #创建表,“__talbename__”后的值代表数据库表名<br> __tablename__ = ‘user‘<br> #创建数据库表的列字段<br> id = Column(Integer,primary_key=True,autoincrement=True)<br> name = Column(String(32))<br> age = Column(Integer)<br><br>#创建引擎,并在此基础上通过pymysql插件,连接数据库。同时创建数据库连接池,设置为5<br>engine = create_engine("mysql+pymysql://root:oldboy@192.168.159.134:3306/day15?charset=utf8", max_overflow=5)<br><br>#找到所有继承Base这个类的子类,并创建子类中定义的所有的数据库表<br>#Base.metadata.create_all(engine)<br><br>#创建session会话<br>Session = sessionmaker(bind = engine)<br>session = Session()<br><br>#实例化类对象,并添加到session中<br>obj = User(name = "alex1",age = 35)#添加单条数据<br>session.add(obj)<br><br>#添加多条数据<br>session.add_all([<br> User(name = "alex2",age = 100),<br> User(name = "alex3",age = 90),<br>])<br><br>#提交数据<br>session.commit()

2、删除数据

  1. #!/usr/bin/env python<br># -*- coding:utf-8 -*-<br>#Author:ye<br><br>#导入模块<br>from sqlalchemy.ext.declarative import declarative_base<br>from sqlalchemy import Column, Integer, String, ForeignKey, UniqueConstraint, Index<br>from sqlalchemy.orm import sessionmaker, relationship<br>from sqlalchemy import create_engine<br><br>#创建继承类Base(规定的写法)<br>Base = declarative_base()<br><br>#创建类,并继承父类Base<br>class User(Base):<br> #创建表,“__talbename__”后的值代表数据库表名<br> __tablename__ = ‘user‘<br> #创建数据库表的列字段<br> id = Column(Integer,primary_key=True,autoincrement=True)<br> name = Column(String(32))<br> age = Column(Integer)<br><br><br>#创建引擎,并在此基础上通过pymysql插件,连接数据库。同时创建数据库连接池,设置为5<br>engine = create_engine("mysql+pymysql://root:oldboy@192.168.159.134:3306/day15?charset=utf8", max_overflow=5)<br><br><br>#创建session会话<br>Session = sessionmaker(bind = engine)<br>session = Session()<br><br>#删除数据,query后边是类名,filter后面跟的是where条件<br>session.query(User).filter(User.id > 3).delete()<br><br>#提交数据<br>session.commit()

3、修改数据

  1. #!/usr/bin/env python<br># -*- coding:utf-8 -*-<br>#Author:ye<br><br>#导入模块<br>from sqlalchemy.ext.declarative import declarative_base<br>from sqlalchemy import Column, Integer, String, ForeignKey, UniqueConstraint, Index<br>from sqlalchemy.orm import sessionmaker, relationship<br>from sqlalchemy import create_engine<br><br>#创建继承类Base(规定的写法)<br>Base = declarative_base()<br><br>#创建类,并继承父类Base<br>class User(Base):<br> #创建表,“__talbename__”后的值代表数据库表名<br> __tablename__ = ‘user‘<br> #创建数据库表的列字段<br> id = Column(Integer,primary_key=True,autoincrement=True)<br> name = Column(String(32))<br> age = Column(Integer)<br><br><br>#创建引擎,并在此基础上通过pymysql插件,连接数据库。同时创建数据库连接池,设置为5<br>engine = create_engine("mysql+pymysql://root:oldboy@192.168.159.134:3306/day15?charset=utf8", max_overflow=5)<br><br><br>#创建session会话<br>Session = sessionmaker(bind = engine)<br>session = Session()<br><br>#修改数据,query后边是类名,filter后面跟的是where条件,update后面跟的是修改的字段及字段内容<br>session.query(User).filter(User.id > 2).update({User.age:User.age + 10},synchronize_session="evaluate")<br><br>#提交数据<br>session.commit()

4、查询数据

  1. #!/usr/bin/env python<br># -*- coding:utf-8 -*-<br>#Author:ye<br><br>#导入模块<br>from sqlalchemy.ext.declarative import declarative_base<br>from sqlalchemy import Column, Integer, String, ForeignKey, UniqueConstraint, Index<br>from sqlalchemy.orm import sessionmaker, relationship<br>from sqlalchemy import create_engine<br><br>#创建继承类Base(规定的写法)<br>Base = declarative_base()<br><br>#创建类,并继承父类Base<br>class User(Base):<br> #创建表,“__talbename__”后的值代表数据库表名<br> __tablename__ = ‘user‘<br> #创建数据库表的列字段<br> id = Column(Integer,primary_key=True,autoincrement=True)<br> name = Column(String(32))<br> age = Column(Integer)<br><br>#创建引擎,并在此基础上通过pymysql插件,连接数据库。同时创建数据库连接池,设置为5<br>engine = create_engine("mysql+pymysql://root:oldboy@192.168.159.134:3306/day15?charset=utf8", max_overflow=5)<br><br>#创建session会话<br>Session = sessionmaker(bind = engine)<br>session = Session()<br><br>#查询数据,query后边是类名<br>result_sql = session.query(User)#结果是生成的sql语句<br>print("result_sql:",result_sql)#SELECT user.id AS user_id, user.name AS user_name, user.age AS user_age FROM user<br><br>result_obj = session.query(User).all()#查询出来的是符合条件的User对象<br>print("result_obj:",result_obj)#[<__main__.User object at 0x00000004E0A6EA58>, <__main__.User object at 0x00000004E0A6E9E8>, <__main__.User object at 0x00000004E0A6EFD0>]<br><br>#将结果打印<br>for result in result_obj:<br> print("user_id:",result.id)<br> print("user_name:",result.name)<br><br>#提交数据<br>session.commit()<br><br>注:查询的其他方式:<em>filter_by内部调用filter</em>
  1.   session = session.query(User.name, User.age).all()#查询user表中name、age列<br><br><em>  session.query(User).filter_by(name=‘alex‘).all()</em>#查询user表中name是alex的所有行
  1. <em>  session.query(User).filter_by(name=‘alex‘).first()</em>#查询user表中name是alex的第一行数据

5、其他查询条件

  1. # 条件
  2. ret = session.query(Users).filter_by(name=‘alex‘).all()
  3. ret = session.query(Users).filter(Users.id > 1, Users.name == ‘eric‘).all()
  4. ret = session.query(Users).filter(Users.id.between(1, 3), Users.name == ‘eric‘).all()#相当于Users.id >1 and Users.id < 3 and Users.name == eric
  5. ret = session.query(Users).filter(Users.id.in_([1,3,4])).all()
  6. ret = session.query(Users).filter(~Users.id.in_([1,3,4])).all()#~表示非
  7. ret = session.query(Users).filter(Users.id.in_(session.query(Users.id).filter_by(name=‘eric‘))).all()#相当于select * from Users where Users.id in (select * from ...)
  8. from sqlalchemy import and_, or_
  9. ret = session.query(Users).filter(and_(Users.id > 3, Users.name == ‘eric‘)).all()
  10. ret = session.query(Users).filter(or_(Users.id < 2, Users.name == ‘eric‘)).all()
  11. ret = session.query(Users).filter(#先进行最里面括号中的and连接,然后再进行外面括号的or连接
  12. or_(
  13. Users.id < 2,
  14. and_(Users.name == ‘eric‘, Users.id > 3),
  15. Users.extra != ""
  16. )).all()
  17. # 通配符
  18. ret = session.query(Users).filter(Users.name.like(‘e%‘)).all()#模糊查询
  19. ret = session.query(Users).filter(~Users.name.like(‘e%‘)).all()
  20. # 限制
  21. ret = session.query(Users)[1:2]
  22. # 排序
  23. ret = session.query(Users).order_by(Users.name.desc()).all()
  24. ret = session.query(Users).order_by(Users.name.desc(), Users.id.asc()).all()
  25. # 分组
  26. from sqlalchemy.sql import func
  27. ret = session.query(Users).group_by(Users.extra).all()
  28. ret = session.query(
  29. func.max(Users.id),#最大值
  30. func.sum(Users.id),#求和
  31. func.min(Users.id)).group_by(Users.name).all()#最小值
  32. ret = session.query(
  33. func.max(Users.id),
  34. func.sum(Users.id),
  35. func.min(Users.id)).group_by(Users.name).having(func.min(Users.id) >2).all()
  36. # 连表
  37. ret = session.query(Users, Favor).filter(Users.id == Favor.nid).all()
  38. ret = session.query(Person).join(Favor).all()
  39. ret = session.query(Person).join(Favor, isouter=True).all()
  40. # 组合
  41. q1 = session.query(Users.name).filter(Users.id > 2)
  42. q2 = session.query(Favor.caption).filter(Favor.nid < 2)
  43. ret = q1.union(q2).all()#组合并去重
  44. q1 = session.query(Users.name).filter(Users.id > 2)
  45. q2 = session.query(Favor.caption).filter(Favor.nid < 2)
  46. ret = q1.union_all(q2).all()#组合不去重

6、多表查询

a.relationship的应用

  1. #!/usr/bin/env python<br># -*- coding:utf-8 -*-<br>#Author:ye<br><br>#导入模块<br>from sqlalchemy.ext.declarative import declarative_base<br>from sqlalchemy import Column, Integer, String, ForeignKey, UniqueConstraint, Index<br>from sqlalchemy.orm import sessionmaker, relationship<br>from sqlalchemy import create_engine<br>import time<br><br>#创建继承类Base(规定的写法)<br>Base = declarative_base()<br><br># 多对多<br>class Department(Base):<br> __tablename__ = ‘department‘<br> id = Column(Integer, primary_key=True)<br> depart_name = Column(String(64), unique=True, nullable=False)<br><br>class Person(Base):<br> __tablename__ = ‘person‘<br><br> id = Column(Integer, primary_key=True, autoincrement=True)<br> user_name = Column(String(64), unique=True, nullable=False)<br> user_depart_id = Column(Integer, ForeignKey(‘department.id‘))#通过此外键进行关联<br><br> #创建两表之间的连接<br> depart = relationship("Department",backref="pers")<br><br># 创建引擎,并在此基础上通过pymysql插件,连接数据库。同时创建数据库连接池,设置为5<br>engine = create_engine("mysql+pymysql://root:oldboy@192.168.159.134:3306/day15?charset=utf8", max_overflow=5)<br><br>#Base.metadata.create_all(engine)<br><br>#创建session会话<br>Session = sessionmaker(bind = engine)<br>session = Session()<br><br>result_obj = session.query(Person).all()<br><br>for result in result_obj:<br> print("person.id:",result.id)<br> print("person.user_name:", result.user_name)<br> print("depart_name:",result.depart.depart_name)

b.session.add的应用

  1. #创建session会话<br>Session = sessionmaker(bind = engine)<br>session = Session()<br><br>#通过session在多表中插入数据<br>session.add(Person(id=10,user_name=‘sb‘,depart=Department(id=9,depart_name="湖南")))<br>session.commit()<br><br>

ORM框架之SQLAlchemy

标签:update   连接数   多表查询   删除   技术分享   max   其他   root   efault   

人气教程排行