使用SQLAlchemyORM技术:Object-Relational Mapping,把关系数据库的表结构映射到对象上 。
在Python中,最有名的ORM框架是SQLAlchemy 。
首先通过pip安装SQLAlchemy:`pip install sqlalchemy`
# 第一步,导入SQLAlchemy,并初始化DBSession:# 导入:from sqlalchemy import Column, String, create_engine,ForeignKeyfrom sqlalchemy.orm import sessionmaker,relationshipfrom sqlalchemy.ext.declarative import declarative_base# 创建对象的基类:Base = declarative_base()# 定义User对象:class User(Base):# 表的名字:__tablename__ = 'users'# 表的结构:id = Column(String(20), primary_key=True)name = Column(String(20))# 以上代码完成SQLAlchemy的初始化和具体每个表的class定义 。如果有多个表,# 就继续定义其他class,例如Schoclass School(Base):__tablename__ = 'school'id = Column(String(20), primary_key=True)name = Column(String(20))# 初始化数据库连接:mysqlconnector和pymysql都可以用# engine = create_engine('mysql+mysqlconnector://root:123456@localhost:3308/test')engine = create_engine('mysql+pymysql://root:123456@localhost:3308/test')# 创建DBSession类型:DBSession = sessionmaker(bind=engine)create_engine()用来初始化数据库连接 。SQLAlchemy用一个字符串表示连接信息:
`数据库类型+数据库驱动名称://用户名:密码@数据库地址:端口号/数据库名`
由于有了ORM,我们向数据库表中添加一行记录,可以视为添加一个User对象:
# 创建所有定义的表到数据库中Base.metadata.create_all(engine)# 创建session对象:session = DBSession()# 创建新User对象:user1 = User(id='1', name='wasd')user2 = User(id='2', name='zxc')user3 = User(id='3', name='qwe')user4 = User(id='4', name='rty')user5 = User(id='5', name='vbn')user6 = User(id='6', name='fgh')# 添加到session:session.add(user1)session.add(user2)session.add(user3)session.add(user4)session.add(user5)session.add(user6)# 提交即保存到数据库:session.commit()# 关闭session:session.close()# 关键是获取session,然后把对象添加到session,最后提交并关闭 。DBSession对象可视为当前数据库连接 。查询数据
# 查询数据# 创建Session:session = DBSession()# 创建Query查询,filter是where条件,最后调用one()返回唯一行,如果调用all()则返回所有行:user = session.query(User).filter(User.id=='1').one()users = session.query(User).filter(User.id!='1').all()# 打印类型和对象的name属性:print('type:', type(user))print('name:', user.name)for user in users:print('type:', type(user))print('name:', user.name)# 关闭Session:session.close()运行结果:
type: <class '__main__.User'>name: wasdtype: <class '__main__.User'>name: zxctype: <class '__main__.User'>name: qwetype: <class '__main__.User'>name: rtytype: <class '__main__.User'>name: vbntype: <class '__main__.User'>name: fghORM就是把数据库表的行与相应的对象建立关联,互相转换 。
由于关系数据库的多个表还可以用外键实现一对多、多对多等关联,相应地,ORM框架也可以提供两个对象之间的一对多、多对多等功能 。
例如,如果一个User拥有多个Book,就可以定义一对多关系如下:
class User(Base):__tablename__ = 'user'__table_args__ = {'extend_existing': True}id = Column(String(20), primary_key=True)name = Column(String(20))# 一对多:books = relationship('Book')class Book(Base):__tablename__ = 'book'id = Column(String(20), primary_key=True)name = Column(String(20))# “多”的一方的book表是通过外键关联到user表的:user_id = Column(String(20), ForeignKey('user.id'))# 当我们查询一个User对象时,该对象的books属性将返回一个包含若干个Book对象的list 。# 创建所有定义的表到数据库中Base.metadata.create_all(engine)更多用法可参考:这篇文章 https://www.jianshu.com/p/65903a69d61d
【「Python」连接数据库的三种方式】
推荐阅读
- 超全的Python图像处理讲解,小白也能懂
- 附代码 什么是Python的迭代器和生成器?
- Python破解BiliBili滑块验证码,完美避开人机识别
- Python 还能实现哪些 AI 游戏?附上代码一起来一把
- 数据更新删除与排序:横向对比 Python、PowerBI、Excel、MySQL
- 用 Python 解析命令行参数
- 用 Python 绘制数据的7种最流行的方法
- 如何监视Python程序的内存使用情况
- |“因为灰色强奸,我陷入了抑郁”「灰色强奸」,可怕在哪儿?
- 5个案例让Python输出漂亮的表格
