Python中使用SQLAlchemy操作数据库

692 阅读2分钟

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。

软硬件环境

  • Windows 10 64bit
  • anaconda with python 3.7
  • mysql 8.0.20
  • sqlalchemy

前言

前文python3中的mysql数据库操作已经介绍过利用pymysql来操作mysql数据库,本文介绍一个ORM框架SQLAlchemy,它可以帮助我们更加优雅、更加高效的实现数据库操作,而且还不限于mysql数据库。

什么是ORM

ORMObject Rational Mapping,对象关系映射。百度百科中是这样解释的

对象-关系映射(OBJECT RELATIONAL MAPPING,简称ORM),是随着面向对象的软件开发方法发展而产生的。用来把对象模型表示的对象映射到基于SQL的关系模型数据库结构中去。这样,我们在具体的操作实体对象的时候,就不需要再去和复杂的SQL语句打交道,只需简单的操作实体对象的属性和方法。ORM技术是在对象和关系之间提供了一条桥梁,前台的对象型数据和数据库中的关系型的数据通过这个桥梁来相互转化。

用一句话来概括就是,把关系数据库的表结构映射到对象上。操作对象的属性就等于操作数据库中的记录。

SQLAlchemy实践

在写代码之前,我们先准备下数据库,这里还是以mysql为例,其它的数据库也类似,可以参靠sqlalchemy的官方文档。

表结构保持跟前文的一致,表名是testtable,有三个字段

  • id,数据类型是INT(11),设为主键、唯一、非空、UNSIGNEDAUTO INCREMENT
  • name,数据类型是VARCHAR(45),设为非空
  • sex,数据类型是VARCHAR(45),设为非空

接下来,安装相关的工具包

pip install pymysql
pip install sqlalchemy

最后来写代码

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

# 创建对象的基类:
Base = declarative_base()

class Person(Base):
	
	# 表名
	__tablename__ = 'testtable'
	
	# 表结构
	id = Column(Integer(),primary_key=True)
	name = Column(String(45))
	sex = Column(String(45))
    
	def __init__(self, id, name, sex):
		self.id = id
		self.name = name
		self.sex = sex

# 初始化数据库连接,:
engine = create_engine('mysql+pymysql://root:toor@localhost:3306/testdb', echo=False)

# 创建DBSession类型:
DBSession = sessionmaker(bind=engine)

session = DBSession()

# 增操作,增加3条记录
item1 = Person(id=1, name='xgx', sex='male')
session.add(item1)

item2 = Person(id=2, name='xgx1', sex='female')
session.add(item2)

item3 = Person(id=3, name='xgx1', sex='male')
session.add(item3)

item4 = Person(id=4, name='xgx2', sex='female')
session.add(item4)

session.commit()
session.close()

# 查操作
session1 = DBSession()
persons = session1.query(Person).filter(Person.id < '4').all()

for i in range(len(persons)):
	print(persons[i].id)
	print(persons[i].name)
	print(persons[i].sex)

session1.close()

# 改操作,将id为2的记录的service_name字段修改为movie
session2 = DBSession()
session2.query(Person).filter(Person.id == '2').update({Person.name: 'xxx'}, synchronize_session=False)
session2.commit()
session2.close()

## 查看修改结果
session3 = DBSession()
print('\n')
print(session3.query(Person).filter(Person.id == '2').one().name)
session3.close()

# 删操作,删除id为3的记录
session4 = DBSession()
session4.query(Person).filter(Person.id == '3').delete()
session4.commit()
session4.close()

执行上述脚本后,用mysql-workbench查看数据库

sqlalchemy

数据库中的记录跟代码要实现的意图是完全相符。

参考资料