1.SQLALchemy使用

  • 安装
pip install sqlalchemy;

  • SQLAlchemy是Python编程语言下的一款开源软件,是PythonSQL工具包和对象关系映射器,它为应用程序开发人员提供了SQL的全部功能和灵活性

2.什么是ORM

  • ORM(Object Relational Mapper)就是把数据库表的行与相应的对象建立关联,互相转换;
  • 目前,最知名的Python ORM是SQLAlchemy和SQLobject;

3.数据库操作

  • 创建表使用create_all()方法,删除表使用drop_all()方法,我们一起来看一下如何创建和删除表
# 导入引擎模块
from sqlalchemy import create_engine
# 导入基类模块
from sqlalchemy.ext.declarative import declarative_base
# 导入字段类
from sqlalchemy import Column, Integer, String
# 导入会话模块
from sqlalchemy.orm import sessionmaker# 实体类的基类
Base = declarative_base()# 实体类
class Teacher(Base):'''实体类的创建有两个方面的用处:1:如果数据库中没有表,那么可以使用实体类创建2:如果数据库中有表,实体类可以映射表的结构,对表的CRUD操作'''# 表名必须指定__tablename__ = 'teacher'id = Column(Integer, primary_key=True, autoincrement=True)name = Column(String(255))age = Column(Integer)# 打印实例的使用可以发现,数据也是保存在实体类实例的__dict__中def __repr__(self):# print(self.__dict__)return "id='%s', name='%s', age='%s" % (self.id, self.name, self.age)__str__ = __repr__# 创建连接引擎
host = 'localhost'
port = 3306
username = 'zengzeng'
password = '123456'
db = 'XKD_Python_Course'
connect_str = 'mysql+mysqldb://{}:{}@{}:{}/{}'.format(username, password, host, port,db)
engine = create_engine(connect_str, echo=True)# 创建表
Base.metadata.create_all(engine)# 删除表
# Base.metadata.drop_all(engine)

我们现在命令工具中查看一下数据库中有没有我们想要的teacher表,上一篇文章中讲过,先登录mysql:mysql -uzengzeng -p123456,然后进入我们要使用的数据库:use XKD_Python_Course,我们先通过:show tables;查看一下数据库中的表,发现没有teacher表
那现在就可以执行代码,创建数据库了,创建好后我们可以在命令行查看一下:show tables;,发现teacher表已经存在了,创建表成功yes!

查看表

想要删除刚刚创建的表,可以使用drop_all()方法,执行代码,再查看数据库表,就可以看teacher表已经被删除了

Base.metadata.drop_all(engine)

  • 插入数据使用session.add_all()方法;
from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column, Integer, String
from sqlalchemy.orm import sessionmakerBase = declarative_base()
class Teacher(Base):__tablename__ = 'teacher'id = Column(Integer, primary_key=True, autoincrement=True)name = Column(String(255))age = Column(Integer)def __repr__(self):# print(self.__dict__)return "id='%s', name='%s', age='%s" % (self.id, self.name, self.age)__str__ = __repr__host = 'localhost'
port = 3306
username = 'zengzeng'
password = '123456'
db = 'XKD_Python_Course'
connect_str = 'mysql+mysqldb://{}:{}@{}:{}/{}'.format(username, password, host, port,db)
engine = create_engine(connect_str, echo=True)# 创建会话,用于提交数据
Session = sessionmaker(bind=engine)
session = Session()# 创建多行行实例,给表添加数据
try:lst = []for i in range(10):teacher = Teacher()teacher.name = 'zengzeng' + str(i)teacher.age = 20 + ilst.append(teacher)print(teacher)# session.add(student) 可以添加一行记录,也可以添加多行记录# 注意:这里将行记录实例添加到session,不会提交,需要手动提交session.add_all(lst)except Exception as e:print('~~~~~~~~~~~'*200)session.rollback()print(e)
finally:session.commit()

我们执行代码,然后去命令工具查看一下表是否插入数据:select * from teacher;

插入数据
  • 查询操作使用session.query()方法,迭代查询;
from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column, Integer, String
from sqlalchemy.orm import sessionmakerBase = declarative_base()
class Teacher(Base):__tablename__ = 'teacher'id = Column(Integer, primary_key=True, autoincrement=True)name = Column(String(255))age = Column(Integer)def __repr__(self):# print(self.__dict__)return "id='%s', name='%s', age='%s" % (self.id, self.name, self.age)__str__ = __repr__host = 'localhost'
port = 3306
username = 'zengzeng'
password = '123456'
db = 'XKD_Python_Course'
conn_str = 'mysql+mysqldb://{}:{}@{}:{}/{}'.format(username, password, host, port,db)
engine = create_engine(conn_str, echo=False)Session = sessionmaker(bind=engine)
session = Session()teacher_obj = session.query(Teacher)
for teacher in  teacher_obj:print(teacher) # 返回结果:{'_sa_instance_state': <sqlalchemy.orm.state.InstanceState object at 0x1063125f8>, 'age': 20, 'name': 'nihao0', 'id': 1}
print('*'*300)# 直接返回实例对象
teacher = session.query(Teacher).get(4)
print(teacher) # 返回结果:{'_sa_instance_state': <sqlalchemy.orm.state.InstanceState object at 0x1075fd400>, 'age': 23, 'name': 'nihao3', 'id': 4}
print(teacher.id)  # 返回 aobama
print(teacher.name)
print(teacher.age)
print('*'*300)# 返回的是可迭代对象
teacher_results = session.query(Teacher).filter(Teacher.id == 5)
for teacher in teacher_results:  # 拿到student实例对象print(teacher)

  • 修改操作:session.update()
from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column, Integer, String
from sqlalchemy.orm import sessionmakerBase = declarative_base()class Teacher(Base):__tablename__ = 'teacher'id = Column(Integer, primary_key=True, autoincrement=True)name = Column(String(255))age = Column(Integer)def __repr__(self):# print(self.__dict__)return "id='%s', name='%s', age='%s" % (self.id, self.name, self.age)__str__ = __repr__# 创建连接引擎
host = 'localhost'
port = 3306
username = 'zengzeng'
password = '123456'
db = 'XKD_Python_Course'
conn_str = 'mysql+mysqldb://{}:{}@{}:{}/{}'.format(username, password, host, port,db)
engine = create_engine(conn_str, echo=False)# 创建会话,用于提交数据
Session = sessionmaker(bind=engine)
session = Session()teacher = session.query(Teacher).get(4)
teacher.name = 'Robby'
teacher.age = '99'
session.commit()

where条件查询

from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column, Integer, String, DATE, Enum, ForeignKey
import enum
from sqlalchemy.orm import sessionmaker
Base = declarative_base()
class My_Enum(enum.Enum):M = 'M'F = 'F'# 实体类
class Emploee(Base):'''+------------+---------------+------+-----+---------+-------+| Field      | Type          | Null | Key | Default | Extra |+------------+---------------+------+-----+---------+-------+| emp_no     | int(11)       | NO   | PRI | NULL    |       || birth_date | date          | NO   |     | NULL    |       || first_name | varchar(14)   | NO   |     | NULL    |       || last_name  | varchar(16)   | NO   |     | NULL    |       || gender     | enum('M','F') | NO   |     | NULL    |       || hire_date  | date          | NO   |     | NULL    |       |+------------+---------------+------+-----+---------+-------+'''__tablename__ = 'employees'emp_no = Column(Integer, primary_key=True, nullable=False)birth_date = Column(DATE, nullable=False)first_name = Column(String(14), nullable=False)last_name = Column(String(16),nullable=False)gender = Column(Enum(My_Enum), nullable=False)hire_date = Column(DATE, nullable=False)def __repr__(self):return "emp_no='%s', birth_date='%s', first_name='%s', last_name='%s', gender='%s', hire_date='%s'" % (self.emp_no, self.birth_date, self.first_name, self.last_name, self.gender, self.hire_date)__str__ = __repr__# 创建连接引擎
host = 'localhost'
port = 3306
username = 'zengzeng'
password = '123456'
db = 'XKD_Python_Course'
conn_str = 'mysql+mysqldb://{}:{}@{}:{}/{}'.format(username, password, host, port,db)
engine = create_engine(conn_str, echo=False)# 创建表
Base.metadata.create_all(engine)# 创建会话,用于提交数据
Session = sessionmaker(bind=engine)
session = Session()# # 简单的where条件查询过滤, 返回可迭代对象, AND 取与
emploees = session.query(Emploee).filter(Emploee.emp_no < 10010).filter(Emploee.gender == 'M')
emploees = session.query(Emploee).filter((Emploee.emp_no > 10010) & (Emploee.gender == 'F'))# OR 取并
emploees = session.query(Emploee).filter((Emploee.emp_no > 10010) | (Emploee.gender == 'F'))# NOT 取反
emploees = session.query(Emploee).filter(~(Emploee.emp_no > 10010))# in
emploees = session.query(Emploee).filter(Emploee.emp_no.in_([10010, 10011, 10012]))# not in
emploees = session.query(Emploee).filter(~Emploee.emp_no.in_([10010, 10011, 10012]))# like ,like可以忽略大小写进行模式匹配
emploees = session.query(Emploee).filter(Emploee.last_name.like('B%'))for emploee in emploees:print(emploee)

order排序

  • asc():升序;
例如:
emploees = session.query(Emploee).filter(Emploee.last_name.like('B%')).order_by(Emploee.emp_no.asc())

  • desc():降序;
例如:
emploees=session.query(Emploee).filter(Emploee.last_name.like('B%')).order_by(Emploee.emp_no.desc())

  • 多字段排序:在语句里面进行多次排序;

聚合与分组

  • list():转化为列表;
  • count():聚合count(*)查询;
  • all(): 转化为列表;
  • limit().one():查询首行;
emploees = session.query(Emploee)
print(list(emploees))         # 转化为列表
print(emploees.count())     # 聚合count(*)查询
print(emploees.all())        # 转化为列表
print(emploees.limit(1).one())    # 查询首行

  • max():返回最大值;
  • min():返回最小值;
  • avg():返回平均值;
emploees = session.query(func.max(Emploee.emp_no))
emploees = session.query(func.min(Emploee.emp_no))
emploees = session.query(func.avg(Emploee.emp_no))

  • group_by():分组查询;
emploees = session.query(func.count(Emploee.emp_no)).group_by(Emploee.gender)
print(emploees)
for emploee in emploees:print(emploee)

参考:https://www.9xkd.com/user/plan-view.html?id=2415909403

根据数据库表gengxin实体类_Python学习第四十八天记录打call:SQLALchemy操作MySQL关系型数据库...相关推荐

  1. 根据数据库表gengxin实体类_ASP.NET开发实战——(十二)数据库之EF Migrations

    在开发数据库应用程序的时候,经常会遇到某些表需要添加字段或者修改类型.新增表等需求,而对于EF Code First来说关注的只有实体类,当需求变更时只需要添加新的实体类或者在实体类中添加.删除.修改 ...

  2. 使用IDEA插件从数据库表生成实体类

    目录 1.介绍 2.添加插件 ​ 3.创建数据库连接 4.添加数据库连接信息和驱动 5.表生成实体类 1.介绍 EasyCode是基于IntelliJ IDEA Ultimate版开发的一个代码生成插 ...

  3. python 数据库表结构转为类_Python数据科学实践 | 数据库1

    大家好,基于Python的数据科学实践课程又到来了,大家尽情学习吧.本期内容主要由智亿同学与政委联合推出. 数据库永远是数据管理上最值得使用的工具.而把所收集的大量数据放入数据库之后再处理是数据科学实 ...

  4. python 数据库表结构转为类_Python sql server和postgresql的表结构转换

    通过Python修改Postgresql的表格:添加Column当繁华落尽时间破碎,我在落败的残花前看见了一地忧伤,所有海誓山盟终不及命运的一夕,转变繁华尽头皆是残缺. 我想通过Python修改Pos ...

  5. 在Eclipse中连接数据库、查看数据表、从数据库表生成实体类

    第一步:连接数据库 点击Eclipse菜单项"Window",选择"Show View",然后再选择其中的"Data Source Explorer& ...

  6. FreeSql实体映射成数据库,数据库映射成实体类,指定表生成实体

    文章目录 codeList DbContext 指定表生成实体 codeList 首先codeList就是一个将实体类映射成数据库表的东西 使用方法: 1.先引入包 补充一下上图:这四个包都要安装 写 ...

  7. eclipse mysql生成实体类_Eclipse实现数据库反向生成实体类(pojo)-------(插件安装和实现步骤的说明)...

    一.插件安装 1.下载插件: http://jaist.dl.sourceforge.net/sourceforge/jboss/HibernateTools-3.2.4.Beta1-R2008103 ...

  8. 怎么创建数据表的实体类和业务类_微服务项目第13天:商品分类业务的实现

    今天是刘小爱自学Java的第143天. 感谢你的观看,谢谢你. 学习计划安排如下: 商品分类业务的初步实现. 数据模型的分析:数据表字段的设计,Java中对应的实体类,前端页面vue组件. 业务模型的 ...

  9. Idea groovy表生成实体类带注释

    Idea groovy表生成实体类带注释 1.点开datasourse,打开idea带的数据库工具,具体添加数据库连接,这里不描述. 这时点击会生成一个poji 这时生成的pojo中是不带中文注释的, ...

最新文章

  1. UI分层中使用PageFactory
  2. A Scala Tutorial for Java Programmers
  3. POJ 3281 -- Dining(最大流,拆点建图)
  4. label标签 html5,HTML5 label 标签
  5. 聊天窗口,新加的内容直接 往上顶
  6. Setting up NUnit for C# Unit Testing with Visual Studio C# Express 2008
  7. Asp.net MVC应用在IIS7上部署后403错误解决方案
  8. [转载]Ubuntu 14.04设置固定ip
  9. html a 标签 邮件超链接 发送邮件
  10. 河南财经政法大学计算机基础,河南财经政法大学就“忘开必修课”情况说明
  11. 你学不好英语,可能是精神内耗太多了
  12. 计算机数学基础①(Numbers)
  13. 典型的DOS攻击技术
  14. MYSQL:Unknown column ‘字段名‘ in ‘field list‘ 错误解决方案
  15. Unity 检测手机性能,区分高中低端机型
  16. 怎么在mysql中创建用户名和密码是什么_mysql中怎么创建用户名和密码
  17. 国内短信服务商厂商比较
  18. Queuing(矩阵快速幂)
  19. html5 语音导航,诺基亚推出HTML5版导航地图
  20. 基于HX711+压力传感器的密度计

热门文章

  1. mysql从库同步delete不动了_MySQL主从同步报错故障处理集锦
  2. Python脚本解密RSA加密密码
  3. c语言中用于判断ch是否是字符的表达式,最新C语言复习题集资料
  4. python教程:getattr函数和hasattr函数的用法
  5. Python中按值来获取指定键的两种方法
  6. Python中文件读写之 w+ 与 r+ 到底有啥区别?
  7. Python中的测试工具
  8. vs(visual studio)调试功能里各个按钮的意义及使用方法?
  9. win10如何使用语音输入文字功能?(语音识别)
  10. python 内置open()函数与os.open()函数的区别(打开文件)