好用的SQLAlchemy

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,高可用系列 2核4GB
简介: 准备安装SQLAlchemy框架测试代码知识点剖析引入库支持基类和引擎实体类声明类数据库自动完成CRUD总结这里简单的记录一下本人第一次使用SQLAlchemy这个ORM框架的过程,也为了今后复习巩固。

这里简单的记录一下本人第一次使用SQLAlchemy这个ORM框架的过程,也为了今后复习巩固。如果您是老鸟的话,就不太适合这篇入门级的文章了。 :-)


准备

首先要做的也就是搭建好环境咯。而且考虑到是操作数据库的,所以也必须有数据库环境才行。有一点需要注意的就是Windows版本的Python内置了对SQLite3的支持,所以不用额外的再安装了。而mac或者linux的就需要自己安装,配置了。

下面的操作,默认是已经配置好了Python环境和MySQL或者SQLite环境。如果还没有进行配置,那下面的步骤就很有可能无法正确的运行了。

安装SQLAlchemy框架。

pip install sqlalchemy

测试代码

下面直接贴出我的测试代码,然后再一点点的进行分析吧。不然,以后回头看也会很枯燥,理解起来效率也不高。

# coding:utf-8
import sys

reload(sys)
sys.setdefaultencoding('utf8')
#    __author__ = '郭 璞'
#    __date__ = '2016/9/29'
#    __Desc__ = 初次尝试PythonORM框架

from sqlalchemy import Column, String, create_engine, ForeignKey
from sqlalchemy.orm import sessionmaker
from sqlalchemy.ext.declarative import declarative_base
from MySQLdb import *

# 创建模型类的基类
# engine = create_engine('sqlite:///tutorial.db')
engine = create_engine('mysql://root:mysql@localhost:3306/test')
Base = declarative_base()

# 模型类
class User(Base):
    __tablename__ = 'user'
    id = Column(String(20), primary_key=True, autoincrement=True)
    name = Column(String(20))

class Book(Base):
    __tablename__ = 'book'
    name = Column(String(20), primary_key=True)
    user_id = Column(String(20), ForeignKey('user.id'))

metadata=Base.metadata
metadata.create_all(bind=engine)

DBSession = sessionmaker(bind=engine)

def store():
    session = DBSession()
    # new_user = User(id='2', name='Mark2')
    book = Book(name='沉默的大多数', user_id='2')
    session.add(book)
    session.commit()
    session.close()
    print 'store success'

def read():
    session = DBSession()
    users = session.query(User).filter(Book.user_id=='2').all()
    for user in users:
        print user.id, user.name
    session.close()

if __name__ == '__main__':
    # store()
    read()

知识点剖析

引入库支持

# 我们创建的实体类的类型所需,Column代表一个字段,String将代表类型为字符串,create_engine是创建一个数据库引擎,用来接下来的关联表的任务,ForeignKey则代表外键的属性,位于Column中。可以指定哪个Column将被作为外键而存在。
from sqlalchemy import Column, String, create_engine, ForeignKey
from sqlalchemy.orm import sessionmaker
from sqlalchemy.ext.declarative import declarative_base
  • 首先是:
# 我们创建的实体类的类型所需,Column代表一个字段,String将代表类型为字符串,create_engine是创建一个数据库引擎,用来接下来的关联表的任务,ForeignKey则代表外键的属性,位于Column中。可以指定哪个Column将被作为外键而存在。

from sqlalchemy import Column, String, create_engine, ForeignKey
  • 然后是:
# 类似于Java的Hibernate框架,session将会是我们对数据库操作的大管家,我们一切的操作都将依赖于这个对象
from sqlalchemy.orm import sessionmaker
  • 最后是:
# 实体类的父类的创建方法,我们任何的实体类都将继承自此方法创建出来的Base基类
from sqlalchemy.ext.declarative import declarative_base

基类和引擎


# engine = create_engine('sqlite:///tutorial.db')
engine = create_engine('mysql://root:mysql@localhost:3306/test')
# 创建模型类的基类,全部实体都要继承自Base类
Base = declarative_base()

从代码中也可以看得出,关联数据库的时候只需要在此指定一下就可以了。而底层的操作全部都被封装了起来,这样数据库的移植就会很方便,这就是框架的艺术。

创建引擎的格式:
数据库类型+数据库驱动://用户名:密码@地址/数据库名称

不过,我在使用mysql数据库的时候就老是出现问题,出现问题的代码如下:

engine = create_engine('mysql+mysqlconnector://root:mysql@localhost:3306/test')

# 错误信息是No module named mysql;网上的答案说的是版本不兼容问题,建议大家应该尽量避免使用这种方式

实体类

声明类

# 模型类
class User(Base):
    __tablename__ = 'user'
    id = Column(String(20), primary_key=True, autoincrement=True)
    name = Column(String(20))

class Book(Base):
    __tablename__ = 'book'
    name = Column(String(20), primary_key=True)
    user_id = Column(String(20), ForeignKey('user.id'))

创建类的过程跟我们在原生的sql语句类似,我们只需要小心的指定相关的类型,字段即可。注意主键,外键的使用直接声明的位置,这很方便。

数据库自动完成

metadata=Base.metadata
metadata.create_all(bind=engine)

这样,SQLAlchemy框架就会自动的按照我们刚才声明的实体类规则来创建相关的表结构了。

注意要绑定到engine中,否则框架不知道再哪个数据库中执行。

CRUD

数据库嘛,离不开增删改查这些功能。类似于Hibernate,session帮助我们完成一切操作。

# 核心大管家,非常重要
DBSession = sessionmaker(bind=engine)

def store():
    session = DBSession()
    # new_user = User(id='2', name='Mark2')
    book = Book(name='沉默的大多数', user_id='2')
    session.add(book)
    session.commit()
    session.close()
    print 'store success'

def read():
    session = DBSession()
    users = session.query(User).filter(Book.user_id=='2').all()
    for user in users:
        print user.id, user.name
    session.close()

查询操作以Stream流的方式得以进行,所以我们可以很方便的处理这些流数据。相关的API还有很多,不适合在这里讲解,故略之。

总结

SQLAlchemy是一个企业级的ORM框架,经得起了实践的考验,里面的内容还有很多。学习的道路还很远,同志仍需努力!

:-)

学习的过程就是不断发现错误,修复错误的过程。学习的时候要抱有一颗新手心态,谨慎,认真的对待遇到的每一个问题。

生乎吾前,其闻道也固先乎吾,吾从而师之;
生乎吾后,其闻道也亦先乎吾,吾从而师之;
吾师道也,夫庸知其年之先后生于吾乎?

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
3月前
|
SQL 关系型数据库 API
SQLAlchemy模型使用
SQLAlchemy模型使用
SQLAlchemy模型使用
|
5月前
|
SQL 存储 Go
【译】SQLAlchemy文档:SQLAlchemy 统一教程
【译】SQLAlchemy文档:SQLAlchemy 统一教程
|
5月前
|
SQL 数据库 开发者
Flask、SQLAlchemy
【6月更文挑战第5天】
43 3
【Flask实战】sqlalchemy和Flask-SQLAlchemy使用对比
【Flask实战】sqlalchemy和Flask-SQLAlchemy使用对比
|
存储 SQL 数据库连接
SQLAlchemy常用数据类型
SQLAlchemy常用数据类型
|
SQL 存储 关系型数据库
【flask-sqlalchemy】SQLAlchemy+PyMysql到mysql的映射
【flask-sqlalchemy】SQLAlchemy+PyMysql到mysql的映射
194 0
|
测试技术 Go
peewee.OperationalError: no such table
peewee.OperationalError: no such table
140 0
peewee.OperationalError: no such table
|
SQL 前端开发 关系型数据库
7. 给Lamb配置flask-sqlalchemy
由于之前已经有一篇介绍flask_sqlalchemy的文章了,这里大体内容就不介绍了。由于在公司的golang项目里有在使用gorm,个人觉得实在是方便,已经从sql奴隶变成了sql大哥,CRUD简直是得心应手。所以这里还是废话不多说,直接采用flask_sqlalchemy。
7. 给Lamb配置flask-sqlalchemy
|
SQL Ubuntu 关系型数据库
SQLALchemy框架
SQLAlchemy 是 Python 中一个通过 ORM 操作数据库的框架。 SQLAlchemy对象关系映射器提供了一种方法,用于将用户定义的Python类与数据库表相关联,并将这些类(对象)的实例与其对应表中的行相关联
211 0
|
数据库
sqlalchemy
  通常我们在数据库中设计好了多张表,在SQLAlchemy中有个autoload可以自动加载. 让我们的Model都继承自某个虚类,这个虚类在需要时会自动加载一次表结构   生成我们需要的基类,并绑定数据库连接   定义我们的Model,设置表名和外键关联     可以使用session执行SQL了,scoped_session让maker生成的多个session实际上是重用同一个, autocommit=True容易导致Bugs,我们使用默认设置不开启它。
998 0