这里简单的记录一下本人第一次使用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框架,经得起了实践的考验,里面的内容还有很多。学习的道路还很远,同志仍需努力!

:-)

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

生乎吾前,其闻道也固先乎吾,吾从而师之;

生乎吾后,其闻道也亦先乎吾,吾从而师之;

吾师道也,夫庸知其年之先后生于吾乎?

好用的SQLAlchemy的更多相关文章

  1. sqlalchemy学习

    sqlalchemy官网API参考 原文作为一个Pythoner,不会SQLAlchemy都不好意思跟同行打招呼! #作者:笑虎 #链接:https://zhuanlan.zhihu.com/p/23 ...

  2. tornado+sqlalchemy+celery,数据库连接消耗在哪里

    随着公司业务的发展,网站的日活数也逐渐增多,以前只需要考虑将所需要的功能实现就行了,当日活越来越大的时候,就需要考虑对服务器的资源使用消耗情况有一个清楚的认知.     最近老是发现数据库的连接数如果 ...

  3. 冰冻三尺非一日之寒-mysql(orm/sqlalchemy)

    第十二章  mysql ORM介绍    2.sqlalchemy基本使用 ORM介绍: orm英文全称object relational mapping,就是对象映射关系程序,简单来说我们类似pyt ...

  4. Python 【第六章】:Python操作 RabbitMQ、Redis、Memcache、SQLAlchemy

    Memcached Memcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载.它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高动态.数据库驱动网站的速度 ...

  5. SQLAlchemy(一)

    说明 SQLAlchemy只是一个翻译的过程,我们通过类来操作数据库,他会将我们的对应数据转换成SQL语句. 运用ORM创建表 #!/usr/bin/env python #! -*- coding: ...

  6. sqlalchemy(二)高级用法

    sqlalchemy(二)高级用法 本文将介绍sqlalchemy的高级用法. 外键以及relationship 首先创建数据库,在这里一个user对应多个address,因此需要在address上增 ...

  7. sqlalchemy(一)基本操作

    sqlalchemy(一)基本操作 sqlalchemy采用简单的Python语言,为高效和高性能的数据库访问设计,实现了完整的企业级持久模型. 安装 需要安装MySQLdb pip install ...

  8. python SQLAlchemy

    这里我们记录几个python SQLAlchemy的使用例子: 如何对一个字段进行自增操作 user = session.query(User).with_lockmode('update').get ...

  9. Python-12-MySQL & sqlalchemy ORM

    MySQL MySQL相关文章这里不在赘述,想了解的点击下面的链接: >> MySQL安装 >> 数据库介绍 && MySQL基本使用 >> MyS ...

  10. 20.Python笔记之SqlAlchemy使用

    Date:2016-03-27 Title:20.Python笔记之SqlAlchemy使用 Tags:python Category:Python 作者:刘耀 博客:www.liuyao.me 一. ...

随机推荐

  1. 关于字数太多直接变成省略号的方法css

    文字超出限制的宽度自动隐藏,并且变为省略号 这是之前写的,现在要做一个两行的 于是万能找百度,居然真的有这个方法: 于是,我就变成了搬运工:○( ^皿^)っHiahiahia- http://blog ...

  2. Python系列之 - 面向对象(2)

    类的三大特性 类的三大特性包括: 封装.继承.多态 一 封装 封装就是将类所用到的所有字段.属性.方法都包含在类代码段里面,当实例调用直接调用类中的方法即可. class People(object) ...

  3. js switch判断 三目运算 while 及 属性操作

    三 目运算:如var a = 10: var b= 12: c = a>b ?a:b; 若成立执行a否则执行b var isHide = true; 若用if判断语句如下 if(isHide) ...

  4. [POJ 2104]K-th Number【模板】(主席树)

    题目背景 这是个非常经典的主席树入门题——静态区间第K小 数据已经过加强,请使用主席树.同时请注意常数优化 题目描述 如题,给定N个正整数构成的序列,将对于指定的闭区间查询其区间内的第K小值. 输入输 ...

  5. [HNOI2015]菜肴制作

    题目描述 知名美食家小 A被邀请至ATM 大酒店,为其品评菜肴. ATM 酒店为小 A 准备了 N 道菜肴,酒店按照为菜肴预估的质量从高到低给予1到N的顺序编号,预估质量最高的菜肴编号为1. 由于菜肴 ...

  6. Codeforces 700E. Cool Slogans

    Description 给定一个串 \(S\),求一个序列 \(a_i\),满足 \(a_i\) 是原串的子串,且 \(a_i\) 在 \(a_{i-1}\) 中至少出现两次,求这个序列的最大的长度 ...

  7. ●SPOJ 8222 NSUBSTR - Substrings(后缀数组)

    题链: http://www.spoj.com/problems/NSUBSTR/ 题解: 同届红太阳 --WSY给出的后缀数组解法!!! 首先用倍增算法求出 sa[i],rak[i],hei[i]然 ...

  8. uva 10118(DP)

    UVA 10118 题意: 有4堆糖果,每堆有n(最多40)个,有一个篮子,最多装5个糖果,我们每次只能从某一堆糖果里拿出一个糖果, 如果篮子里有两个相同的糖果,那么就可以把这两个(一对)糖果放进自己 ...

  9. [bzoj4864][BeiJing 2017 Wc]神秘物质

    来自FallDream的博客,未经允许,请勿转载,谢谢. 21ZZ 年,冬. 小诚退休以后, 不知为何重新燃起了对物理学的兴趣. 他从研究所借了些实验仪器,整天研究各种微观粒子.这 一天, 小诚刚从研 ...

  10. Python中模块之xml的讲解

    xml模块的功能介绍 这里主要讲解xml模块下的etree.ElementTree类. 1. 创建 具体代码如下 import xml.etree.ElementTree as XM namelist ...