好用的SQLAlchemy
这里简单的记录一下本人第一次使用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的更多相关文章
- sqlalchemy学习
sqlalchemy官网API参考 原文作为一个Pythoner,不会SQLAlchemy都不好意思跟同行打招呼! #作者:笑虎 #链接:https://zhuanlan.zhihu.com/p/23 ...
- tornado+sqlalchemy+celery,数据库连接消耗在哪里
随着公司业务的发展,网站的日活数也逐渐增多,以前只需要考虑将所需要的功能实现就行了,当日活越来越大的时候,就需要考虑对服务器的资源使用消耗情况有一个清楚的认知. 最近老是发现数据库的连接数如果 ...
- 冰冻三尺非一日之寒-mysql(orm/sqlalchemy)
第十二章 mysql ORM介绍 2.sqlalchemy基本使用 ORM介绍: orm英文全称object relational mapping,就是对象映射关系程序,简单来说我们类似pyt ...
- Python 【第六章】:Python操作 RabbitMQ、Redis、Memcache、SQLAlchemy
Memcached Memcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载.它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高动态.数据库驱动网站的速度 ...
- SQLAlchemy(一)
说明 SQLAlchemy只是一个翻译的过程,我们通过类来操作数据库,他会将我们的对应数据转换成SQL语句. 运用ORM创建表 #!/usr/bin/env python #! -*- coding: ...
- sqlalchemy(二)高级用法
sqlalchemy(二)高级用法 本文将介绍sqlalchemy的高级用法. 外键以及relationship 首先创建数据库,在这里一个user对应多个address,因此需要在address上增 ...
- sqlalchemy(一)基本操作
sqlalchemy(一)基本操作 sqlalchemy采用简单的Python语言,为高效和高性能的数据库访问设计,实现了完整的企业级持久模型. 安装 需要安装MySQLdb pip install ...
- python SQLAlchemy
这里我们记录几个python SQLAlchemy的使用例子: 如何对一个字段进行自增操作 user = session.query(User).with_lockmode('update').get ...
- Python-12-MySQL & sqlalchemy ORM
MySQL MySQL相关文章这里不在赘述,想了解的点击下面的链接: >> MySQL安装 >> 数据库介绍 && MySQL基本使用 >> MyS ...
- 20.Python笔记之SqlAlchemy使用
Date:2016-03-27 Title:20.Python笔记之SqlAlchemy使用 Tags:python Category:Python 作者:刘耀 博客:www.liuyao.me 一. ...
随机推荐
- [LeetCode] Minimum Genetic Mutation 最小基因变化
A gene string can be represented by an 8-character long string, with choices from "A", &qu ...
- ActiveMQ(七)_伪集群和主从高可用使用(转)
本文转自: https://www.cnblogs.com/gossip/p/5977489.html 一.本文目的 介绍如何在同一台虚拟机上搭建高可用的Activemq服务,集群数量 ...
- postman学习笔记(一)——最简单的postman入门
昨天开始正式接触postman的操作,最简单的操作是根据接口文档一个个测试接口. 例如: 测试环境地址:http://111.2.198.4(项目组自己的测试环境,要测试的项目组肯定会给你的) //以 ...
- pyqt4 写动画不能播放问题集合
最近在学习动画,真的真的是血泪史,百度基本是0资源,各种在谷歌外国大佬的英文中躺过一个一个血坑....... 这是随便写的一个动画功能调试窗口..... 问题现象: 点击食灵,没反应,写的动画不能生成 ...
- react-router 4实现代码分割(code spliting)
官方一开始推荐的使用bundle-loader来做代码分割的方式感觉有点麻烦,而且代码看起来有点不舒服.而且需要一直依赖bunder-loader 一开始我想为什么不能像vue一样,直接使用ES的新特 ...
- [SCOI2009]围豆豆
Description Input 第一行两个整数N和M,为矩阵的边长. 第二行一个整数D,为豆子的总个数. 第三行包含D个整数V1到VD,分别为每颗豆子的分值. 接着N行有一个N×M的字符矩阵来描述 ...
- codefroces 55D Beautiful numbers
[Description] 美丽数是指能被它的每一位非0的数字整除的正整数. [Input] 包含若干组数据,每组数据一行两个数n,m,表示求[n,m]之间的美丽数的个数. [output] 对于每组 ...
- 【BZOJ2733】【HNOI2012】永无乡
原题传送门 题意:给你N个带权点,一开始相互独立(每个点视为单独一个集合),有2种操作:1)合并2个集合:2)查询包含某元素集合内的权值第k小点编号. 解题思路:显然合并就是并查集,而查询则是平衡树实 ...
- bzoj 1558: [JSOI2009]等差数列
Description Solution 把原数组变为差分数组,然后剩下的就十分显然了 区间查询用线段树维护 修改操作就是区间加法和两个单点修改 一个等差数列实际上就是 开头一个数字+数值相等的一段 ...
- ●洛谷P3348 [ZJOI2016]大森林
题链: https://www.luogu.org/problemnew/show/P3348 题解: LCT,神题 首先有这么一个结论: 每次的1操作(改变生长点操作),一定只会会对连续的一段区间产 ...