SQLAlchemy的是Python的SQL工具包和对象关系映射,给应用程序开发者提供SQL的强大功能和灵活性。

安装
pip install mysql-python
pip install sqlalchemy 初始化
SQLAlchemy ORM提供了一个连接数据库表和用户自定义Python类的方法。 在使用ORM时,我们要初始化一些基本的变量。 定义映射基类
类的映射(Mapping)使用已经在基类中定义的声明式系统,declarative_base类维持了一个从类到表的关系,通常一个应用使用一个base实例,所有实体类都应该继承此类对象。
我们的应用在一般导入的模块中将只有一个这个基类的实例,使用declarative_base()创建这个基类的实例。 from sqlalchemy.ext.declarative import declarative_base
Base = declarative_base() 创建engine
ORM操作数据库的句柄就是Session。在创建session前,我们先创建一个engine实例。 from sqlalchemy import create_engine
mysql_engine = create_engine("mysql://root:1@127.0.0.1/cms?charset=utf8",
pool_size=1,
max_overflow=10,
echo=False,
encoding='utf-8',
pool_recycle=20000
) 创建session
当我们启动我们的应用时,在create_engine()的同时,我们定义了一个Session类将作为一个创建Session实例的工厂。 from sqlalchemy.orm import sessionmaker
Session = sessionmaker(bind=engine)
1
2
把上面三部整理到一个base.py文件中,方便后续调用: # coding: utf-8
"""
base.py
Usage: 使用sqlalchemy中的base类型
"""
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker
from sqlalchemy.ext.declarative import declarative_base Base = declarative_base() mysql_engine = create_engine("mysql://root:1@127.0.0.1/cms?charset=utf8",
pool_size=1,
max_overflow=10,
echo=False,
encoding='utf-8',
pool_recycle=20000
) Session = sessionmaker(bind=mysql_engine) 实体类(model)
我们基于base.py定义了一个User类。sqlalchemy 就是把Base子类转变为数据库表,定义好User类后,会生成Table和mapper(),分别通过User.table 和User.mapper返回这两个对象。 # coding: utf-8
import logging
from sqlalchemy import *
from base import Base
from base import Session class User(Base):
__tablename__ = 'user'
__table_args__ = {'mysql_engine': 'InnoDB', 'mysql_charset': 'utf8'} id = Column(BigInteger, primary_key=True)
name = Column(String(100), nullable=False)
password = Column(String(100), nullable=False) @classmethod
def to_dict(cls, row):
if not row:
return None d = {'id': row.id,
'name': row.name,
'password': row.password
} return d @classmethod
def get(cls, session, user_id):
row = session.query(cls).filter(cls.id == user_id).first() return cls.to_dict(row) @classmethod
def update(cls, session, user_id, name, password):
try:
session.query(cls.id == user_id).update({cls.name: name, cls.password: password})
session.commit()
return True
except Exception, e:
logging.error(e)
return False @classmethod
def add(cls, session, name, password):
user = cls(name=name,
password=password) session.add(user)
try:
session.commit()
return user.id
except Exception, e:
logging.error(e)
return None @classmethod
def remove(cls, session, user_id):
try:
session.query(cls.id == user_id).delete()
session.commit()
return True
except Exception, e:
logging.error(e)
return False if __name__ == '__main__':
session = Session() user_id = User.add(session, name='test', password='123')
print User.get(session, user_id=user_id) print User.update(session, user_id, name='update', password='456')
print User.get(session, user_id=user_id) print User.remove(session, user_id=user_id)
print User.get(session, user_id=user_id) session.close() 执行结果: {'password': u'123', 'id': 3L, 'name': u'test'}
True
{'password': u'456', 'id': 3L, 'name': u'update'}
True
None
1
2
3
4
5
在这个model中基于session,实现了对数据增删查改的方法。 增删查改
add
user = cls(name=name,
password=password) session.add(user)
1
2
3
4
在调用add时,user实例是待定的(pending),不执行任何SQL,不会触发insert,因此也不代表数据库中的一行数据。
当使用一个flush过程时,Session将执行SQL来持久化user。 对象状态 对象实例有四种状态,分别是:
1. Transient(瞬时的):这个状态的对象还不在session中,也不会保存到数据库中,主键为None(不是绝对的,如果Persistent对象rollback后虽然主键id有值,但还是Transient状态的)。
2. Pending(挂起的):调用session.add()后,Transient对象就会变成Pending,这个时候它还是不会保存到数据库中,只有等到触发了flush动作才会存在数据库,比如query操作就可以出发flush。同样这个时候的实例的主键一样为None
3. Persistent(持久的):session中,数据库中都有对应的一条记录存在,主键有值了。
4. Detached(游离的):数据库中有记录,但是session中不存在,对这个状态的对象进行操作时,不会触发任何SQL语句。 Session是真正与数据库通信的handler,我们告诉Session我们想要将所有的改变(add,delete,update)存入到数据库,提交事务;然后通过commit()来执行。 query
查询 Query对象通过Session.query获取,query接收类或属性参数,以及多个类。 row = session.query(cls).filter(and_(cls.name == name, cls.password == password)).first()
1
执行query时,session返回同一行(对象)就是我们刚刚在session内部的类的字典持久化的对象,所以我们事实上获得的就是我们加入Session中的实例。
Session 使用 connection发送query,把返回的result row 填充到一个Python object中,该对象同时还会保存在Session中,Session内部有一个叫 Identity Map的数据结构,为每一个对象维持了唯一的副本。 filter()方法通常接收的是Python操作符,而filter_by()方法使用关键字参数。filter可以接收更加灵活的SQL表达式结构,一般情况下,基本够用了。 查询返回结果有多种:
1. query.all(),all()返回列表
2. query.first(),返回第一个元素
3. query.one(),有且只有一个元素时才正确返回。 delete
session.query(cls.id == user_id).delete()
1
update
session.query(cls.id == user_id).update({cls.name: name, cls.password: password})
1
小结
本文记录了使用SQLAlchemy实现常见的CRUD操作,后续会继续记录使用中踩到的坑和一些使用技巧。
SQLAlchemy 在构建在 WSGI 规范上的Python Web 框架中得到了广泛应用,在我司的生产环境中久经考验,配合Flask和Tornado一起开发效率极高。

  https://blog.csdn.net/dutsoft/article/details/74842722

Python SQLAlchemy ORM示例的更多相关文章

  1. Python sqlalchemy orm 多对多外键关联

    多对多外键关联 注:使用三张表进行对应关联 实现代码: # 创建3个表 配置外键关联 # 调用Column创建字段 加类型 from sqlalchemy import Table, Column, ...

  2. Python sqlalchemy orm 常用操作

    增add # 创建表1 # 注:高级封装 import sqlalchemy # 调用链接数据库 from sqlalchemy import create_engine # 调用基类Base fro ...

  3. Python sqlalchemy orm 外键关联

    创建外键关联 并通过relationship 互相调用 如图: 实现代码: import sqlalchemy # 调用链接数据库 from sqlalchemy import create_engi ...

  4. Python sqlalchemy orm 多外键关联

     多外键关联 注:在两个表之间进行多外键链接 如图: 案例: # 创建两张表并添加外键主键 # 调用Column创建字段 加类型 from sqlalchemy import Integer, For ...

  5. Python SQLAlchemy --3

    本文為 Python SQLAlchemy ORM 一系列教學文: 刪除 學會如何查詢之後,就能夠進行後續的刪除.更新等操作. 同樣地,以幾個範例做為學習的捷徑. 123456789 user_1 = ...

  6. Python SQLAlchemy --2

    本文為 Python SQLAlchemy ORM 一系列教學文: 接下來會更深入地探討查詢的使用. 查詢的基本使用法為 session.query(Mapped Class),其後可加 .group ...

  7. Python SQLAlchemy --1

    本文為 Python SQLAlchemy ORM 一系列教學文: SQLAlchemy 大概是目前 Python 最完整的資料庫操作的套件了,不過最令人垢病的是它的文件真的很難閱讀,如果不搭配個實例 ...

  8. python的ORM框架SQLAlchemy

    本节内容 ORM介绍 sqlalchemy安装 sqlalchemy基本使用 多外键关联 多对多关系 表结构设计作业  一.ORM介绍 如果写程序用pymysql和程序交互,那是不是要写原生sql语句 ...

  9. python 学习笔记十一 SQLALchemy ORM(进阶篇)

    SqlAlchemy ORM SQLAlchemy是Python编程语言下的一款ORM框架,该框架建立在数据库API之上,使用关系对象映射进行数据库操作,简言之便是:将对象转换成SQL,然后使用数据A ...

随机推荐

  1. ubuntu下一款有点感觉的 linux音乐播放器 clementine(小橘子))

    https://www.clementine-player.org/ 在linux听音乐的感觉确实不是很好,音乐播放器很多.但是仅仅只是数量上的优势,在确实不是很好用.自带的rhythmbox确实很占 ...

  2. git fetch批处理,遍历一个文件夹下的所有子目录,执行git fetch --all

    echo off for /d %%i in (*) do ( echo %%i cd %%i git fetch --all cd .. ) 判断子目录是否有.git文件夹 echo off for ...

  3. Django 创建新项目后要完成的几个步骤

    首先,在过一遍创建新项目的步骤: -创建一个新项目 -建了数据库后要确定自己是用 mysql数据库  还是用 sqlite3数据库 -如果是mysql数据库,那一堆配置 -如果是sqlite3数据库, ...

  4. HDU3533 Escape

    题目: The students of the HEU are maneuvering for their military training. The red army and the blue a ...

  5. 认识JDK、JRE、JVM

    JDK.JRE.JVM之间的关系: 首先看看JDK与JRE的区别与联系,如下图所示: 由图可知: JDK = JRE + Tools&Tool APIs JDK的核心是Java SE API. ...

  6. 2.sql server的管理

    sql server的管理:需要安装sql server 2005或者sql server 2008,若要使用sqlserver管理工具进行开发还要安装sql server management st ...

  7. RFC1867 HTTP file upload

    RFC1867 HTTP file upload RFC1867 is the standard definition of that "Browse..." button tha ...

  8. 解决Latex复制到公众号可能报“图片粘贴失败”的问题

    前几天出了个版本,还发了篇“Md2All,让公众号完美显示Latex数学公式”的文章,发完后,心里还是不太爽的,因为那个版本还是遗留了一个问题:当把Latex公式转换为本地图片,再复制到公众号时,有可 ...

  9. avaScript中变量的声明和赋值

    变量是指程序中一个已经命名的存储单元,它的主要作用就是为数据操作提供存放信息的容器.变量是相对常量而言的.常量是一个不会改变的固定值,而变量的值可能会随着程序的执行而改变.变量有两个基本特征,即变量名 ...

  10. 九九乘法表---for循环的嵌套

    package com.zuoye.test;//控制台输出九九乘法表public class Jiujiu { public static void main(String[] args) { in ...