`

使用SQLAlchemy(转载)

阅读更多

数据库表是一个二维表,包含多行多列。把一个表的内容用Python的数据结构表示出来的话,可以用一个list表示多行,list的每一个元素是tuple,表示一行记录,比如,包含idnameuser表:

[
    ('1', 'Michael'),
    ('2', 'Bob'),
    ('3', 'Adam')
]

 Python的DB-API返回的数据结构就是像上面这样表示的。

但是用tuple表示一行很难看出表的结构。如果把一个tuple用class实例来表示,就可以更容易地看出表的结构来:

class User(object):
    def __init__(self, id, name):
        self.id = id
        self.name = name

[
    User('1', 'Michael'),
    User('2', 'Bob'),
    User('3', 'Adam')
]

 这就是传说中的ORM技术:Object-Relational Mapping,把关系数据库的表结构映射到对象上。是不是很简单?

但是由谁来做这个转换呢?所以ORM框架应运而生。

在Python中,最有名的ORM框架是SQLAlchemy。我们来看看SQLAlchemy的用法。

首先通过pip安装SQLAlchemy:

 pip install sqlalchemy

 然后,利用上次我们在MySQL的test数据库中创建的user表,用SQLAlchemy来试试:

第一步,导入SQLAlchemy,并初始化DBSession:

# 导入:
from sqlalchemy import Column, String, create_engine
from sqlalchemy.orm import sessionmaker
from sqlalchemy.ext.declarative import declarative_base

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

# 定义User对象:
class User(Base):
    # 表的名字:
    __tablename__ = 'user'

    # 表的结构:
    id = Column(String(20), primary_key=True)
    name = Column(String(20))

# 初始化数据库连接:
engine = create_engine('mysql+mysqlconnector://root:password@localhost:3306/test')
# 创建DBSession类型:
DBSession = sessionmaker(bind=engine)

 以上代码完成SQLAlchemy的初始化和具体每个表的class定义。如果有多个表,就继续定义其他class,例如School:

class School(Base):
    __tablename__ = 'school'
    id = ...
    name = ...

 create_engine()用来初始化数据库连接。SQLAlchemy用一个字符串表示连接信息:

'数据库类型+数据库驱动名称://用户名:口令@机器地址:端口号/数据库名'

 你只需要根据需要替换掉用户名、口令等信息即可。

下面,我们看看如何向数据库表中添加一行记录。

由于有了ORM,我们向数据库表中添加一行记录,可以视为添加一个User对象:

# 创建session对象:
session = DBSession()
# 创建新User对象:
new_user = User(id='5', name='Bob')
# 添加到session:
session.add(new_user)
# 提交即保存到数据库:
session.commit()
# 关闭session:
session.close()

 可见,关键是获取session,然后把对象添加到session,最后提交并关闭。DBSession对象可视为当前数据库连接。

如何从数据库表中查询数据呢?有了ORM,查询出来的可以不再是tuple,而是User对象。SQLAlchemy提供的查询接口如下:

# 创建Session:
session = DBSession()
# 创建Query查询,filter是where条件,最后调用one()返回唯一行,如果调用all()则返回所有行:
user = session.query(User).filter(User.id=='5').one()
# 打印类型和对象的name属性:
print('type:', type(user))
print('name:', user.name)
# 关闭Session:
session.close()

 运行结果如下:

type: <class '__main__.User'>
name: Bob

 可见,ORM就是把数据库表的行与相应的对象建立关联,互相转换。

由于关系数据库的多个表还可以用外键实现一对多、多对多等关联,相应地,ORM框架也可以提供两个对象之间的一对多、多对多等功能。

例如,如果一个User拥有多个Book,就可以定义一对多关系如下:

class User(Base):
    __tablename__ = 'user'

    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。

小结

ORM框架的作用就是把数据库表的一行记录与一个对象互相做自动转换。

正确使用ORM的前提是了解关系数据库的原理。

分享到:
评论

相关推荐

    sqlalchemy documentation sqlalchemy 文档

    - 使用**SQLAlchemy ORM** 定义表结构。 - 示例代码: ```python from sqlalchemy import Column, Integer, String from sqlalchemy.ext.declarative import declarative_base Base = declarative_base() class...

    Python使用SQLAlchemy.docx

    Python使用SQLAlchemy.docx

    sqlalchemy

    14. 关系和继承的使用:SQLAlchemy提供了对继承支持的处理方式,允许灵活地映射类到多个表或者使用子查询来处理继承关系。 15. 高级映射技术:开发者可以使用多种高级映射技术,如任意select语句的映射、针对多个表...

    SQLAlchemy

    SQLAlchemy是一种流行的ORM(对象关系映射)工具,它在Python社区中被广泛使用,特别是在数据库操作和管理方面。ORM工具的主要目的是将数据库中的数据表结构映射到编程语言中的对象模型,允许开发者使用更加面向对象...

    FlaskSQLAlchemy下载及安装

    **Flask-SQLAlchemy**是Python微框架Flask的一个扩展,它使得在Flask应用中集成和使用SQLAlchemy变得更加方便。SQLAlchemy是Python的一个强大的ORM(对象关系映射)库,能够将数据库操作转化为面向对象的编程方式。...

    sqlalchemy的使用举例源码

    `SQLAlchemy`是Python中的一款强大的ORM(对象关系映射)库,它允许开发者使用Python类来定义数据库模式,并在Python代码中操作这些模式,从而避免了直接编写SQL语句的繁琐。在这个“sqlalchemy的使用举例源码”中,...

    SQLAlchemy详细教程

    SQLAlchemy 是一个 Python 的关系型数据库工具包,提供了一个高级的对象关系映射(Object-Relational Mapping,ORM)系统,允许开发者使用 Python 对象来交互数据库,而不需要直接使用 SQL 语言。下面是 SQLAlchemy ...

    sqlalchemy文档资料翻译

    - **Column and Data Types**:涵盖SQLAlchemy中的各种数据类型及其使用方法,以及如何自定义数据类型。 - **扩展与插件**:`sqlalchemy.ext` 包含了一系列的扩展和插件,这些插件可以增强SQLAlchemy的功能。 ###...

    SQLAlchemy技术文档(中文版)

    - **功能说明**:在使用SQLAlchemy之前,确保安装的版本符合项目需求是非常重要的。可以通过导入SQLAlchemy包并调用`__version__`属性来检查当前安装的SQLAlchemy版本。 ```python import sqlalchemy print...

    Python-基于sqlalchemy自动化实现curddemo

    如果你的项目是基于Flask构建的,可以使用`flask-sqlalchemy`扩展简化数据库配置。只需几行代码,就能在Flask应用中轻松集成SQLAlchemy: ```python from flask import Flask from flask_sqlalchemy import ...

    Python SQLAlchemy入门教程(基本用法)

    标题“Python SQLAlchemy入门教程(基本用法)”表明本文档是一份面向初学者的教程,旨在介绍如何使用Python中的SQLAlchemy库来进行数据库操作。SQLAlchemy是一个流行的对象关系映射(ORM)工具,它允许开发者通过...

    python sqlalchemy 使用手册 英文版

    整体而言,这份SQLAlchemy使用手册为Python程序员提供了一份全面且详细的参考资料,涵盖了从安装到高级功能配置的全部内容。文档以英文编写,适合具有一定英文阅读能力的开发者使用。对于那些希望高效利用SQLAlchemy...

    sqlalchemy骚操作.txt

    sqlalchemy语法的各种操作记录。没事可以自己看看; sqlalchemy语法的各种操作记录。没事可以自己看看。 sqlalchemy语法的各种操作记录。没事可以自己看看。 sqlalchemy语法的各种操作记录。没事可以自己看看。 ...

    Python利用flask sqlalchemy实现分页效果

    ### 使用Flask-SQLAlchemy实现分页效果 #### 引言 在Web开发中,当数据量较大时,为了提高用户体验以及减轻服务器负担,通常会采用分页技术展示数据。Flask-SQLAlchemy是一个非常流行的扩展,它为Flask框架提供了...

    Python 使用Flask-SQLAlchemy实现数据的多对关系 Python源码

    Python 使用Flask-SQLAlchemy实现数据的多对关系 Python源码Python 使用Flask-SQLAlchemy实现数据的多对关系 Python源码Python 使用Flask-SQLAlchemy实现数据的多对关系 Python源码Python 使用Flask-SQLAlchemy实现...

    SQLAlchemy最新英文文档

    SQLAlchemy是Python编程语言下的一款开源软件。提供了SQL工具包及对象关系映射(ORM)工具,使用MIT许可证...SQLAlchemy首次发行于2006年2月,并迅速地在Python社区中最广泛使用的ORM工具之一,不亚于Django的ORM框架。

Global site tag (gtag.js) - Google Analytics