python 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_enginefrom sqlalchemy.orm import sessionmakerfrom 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。

来源:https://www.icode9.com/content-2-829101.html

(0)

相关推荐

  • 第 86 天:Python SQLAlchemy

    第 86 天:Python SQLAlchemy

  • 第46天:Flask数据持久化

    Web 应用离不开数据存储,今天就来学习下 Flask 中如何与数据库交互,最后我们将做一个提交的实例 Flask 中最方便用的数据库框架是 flask_sqlalchamy,是对 SQLAlcham ...

  • python sqlalchemy 根据数据库自动生成实体类

    第一步 安装包 pip install sqlacodegen pip install pymysql pip install mysqlclient 第二步 修改sqlacodegen包下的__in ...

  • 他哭了  他是一名乡村教师,刚满19周岁...

    他哭了 他是一名乡村教师,刚满19周岁的他师范毕业后就回到他所在的村小当了一名小学教师.他工作勤勤恳恳.踏踏实实,刻苦钻研先后获得了区级教坛新星.骨干教师的称号,还被评为市级最美乡村教师.中心校的领导 ...

  • 中医临床治疗慢性肾炎,可采用以下方法: ...

    中医临床治疗慢性肾炎,可采用以下方法: 一方:党参.苡仁.菟丝子.丹参各15克,当归12克,桃仁.地龙.红花各10克,黄芪.益母草各30克,水煎分3次服. 二方:干燥玉米须50克,加水600克,用温水 ...

  • 【   】存解

    感觉把下面的裙子换成有层次的扇形花更好看,你们觉得呢?不过这是我的个人眼光,各位姐妹们或许有不同想法,欢迎上图分享

  • 赚钱日记:不擅长的事,一定要外包出去  ...

    赚钱日记:不擅长的事,一定要外包出去  ...

  • 【中州作家·母亲节特刊】苏相群:母 亲

      中州作家,从文学到美学[No.782] 母 亲 河南邓州       苏相群 这个夜晚热得叫人难以入睡,不论侧睡卧睡.纱窗外时时传来沙沙的虫鸣声,玻璃窗上摇曳着春末的树影,我翻了翻台灯下的日历,谷 ...

  • 黄煌经方手册。004 白头翁汤

    004 白头翁汤 经典的厥阴病方,传统的清热解毒方,具有止血痢.解热毒.利肛肠的功效. 现代研究提示能抗肿瘤.抗炎.抗菌.抗原虫真菌.调节免疫.促进肠道黏膜修复等. 适用于里急后重.口干舌燥.脉滑数为 ...

  • 黄煌经方手册 005 补中益气汤

    005 补中益气汤 古代的内伤发热专方,传统的补气升阳方, 具有退虚热.抗劳倦.止自汗.健脾胃的功效.现代研究提示能抗抑郁.保护神经.调节免疫.抗病毒.促进精子活力.减轻放射损伤等. 适用于以反复发热 ...