一、ORM介绍:

orm英文全称object relational mapping,就是对象映射关系程序,简单来说我们类似python这种面向对象的程序来说一切皆对象,但是我们使用的数据库却都是关系型的,为了保证一致的使用习惯,通过orm将编程语言的对象模型和数据库的关系模型建立映射关系,这样我们在使用编程语言对数据库进行操作的时候可以直接使用编程语言的对象模型进行操作就可以了,而不用直接使用sql语言。

orm的优点:

  1. 隐藏了数据访问细节,“封闭”的通用数据库交互,ORM的核心。他使得我们的通用数据库交互变得简单易行,并且完全不用考虑该死的SQL语句。快速开发,由此而来。
  2. ORM使我们构造固化数据结构变得简单易行。

缺点:

  1. 无可避免的,自动化意味着映射和关联管理,代价是牺牲性能(早期,这是所有不喜欢ORM人的共同点)。现在的各种ORM框架都在尝试使用各种方法来减轻这块(LazyLoad,Cache),效果还是很显著的。

二、sqlalchemy安装

pip install SQLAlchemy
pip install pymysql 连接数据库:
MySQL-Python
mysql+mysqldb://<user>:<password>@<host>[:<port>]/<dbname> pymysql
mysql+pymysql://<username>:<password>@<host>/<dbname>[?<options>] MySQL-Connector
mysql+mysqlconnector://<user>:<password>@<host>[:<port>]/<dbname> cx_Oracle
oracle+cx_oracle://user:pass@host:port/dbname[?key=value&key=value...] 更多详见:http://docs.sqlalchemy.org/en/latest/dialects/index.html

三、sqlalchemy基本使用

创建表:

import sqlalchemy
from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column,Integer,String engine = create_engine('mysql+pymysql://cheng:123456@192.168.71.3/test_cheng',
encoding = 'utf-8',echo=True) Base = declarative_base() #生成基类 class User(Base):
__tablename__ = 'user' #表名
id = Column(Integer,primary_key=True)
name = Column(String(32))
password = Column(String(64)) Base.metadata.create_all(engine) #创建表结构

插入数据:

import sqlalchemy
from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column,Integer,String
from sqlalchemy.orm import sessionmaker engine = create_engine('mysql+pymysql://cheng:123456@192.168.71.3/test_cheng',
encoding = 'utf-8',echo=True) Base = declarative_base() class User(Base):
__tablename__ = 'user'
id = Column(Integer,primary_key=True)
name = Column(String(32))
password = Column(String(64)) Session_class = sessionmaker(bind=engine)
Session = Session_class()
for i in range(10):
user_obj = User(name='cheng%s'%i,password='%s*321'%i)
Session.add(user_obj) Session.commit()

查询和修改数据:

import sqlalchemy
from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column,Integer,String
from sqlalchemy.orm import sessionmaker engine = create_engine('mysql+pymysql://cheng:123456@192.168.71.3/test_cheng',
encoding = 'utf-8') Base = declarative_base() class User(Base):
__tablename__ = 'user'
id = Column(Integer,primary_key=True)
name = Column(String(32))
password = Column(String(64)) Session_class = sessionmaker(bind=engine)
Session = Session_class()
#1.first生成一个实例,而all生成一个实例列表:
my_user = Session.query(User).filter_by(name='cheng77').first()
print(my_user.id,my_user.name,my_user.password) my_user = Session.query(User).filter_by(name = 'cheng78').all()
for i in my_user:
print(i.id,i.name,i.password) #2.filter_by不支持<,>,==,而filter支持<,>,==而且filter支持多条件查询:
my_user = Session.query(User).filter(User.id < 29).filter(User.id > 13).all()
for i in my_user:
print(i.id,i.name,i.password) #3.修改数据:
my_user = Session.query(User).filter_by(name='cheng77').first()
my_user.name = 'cheng77777'
Session.commit()
print(my_user.id,my_user.name,my_user.password) #4.回滚:
<----插入数据---->
Session.rollback()
<----查询数据没有插入----> #5.统计和分组:
conn = Session.query(User).filter(User.name.like('ch%')).count()
print(conn) from sqlalchemy import func
list_group = Session.query(func.count(User.name),User.name).group_by(User.name).all()
for i in list_group:
print(i) #6.将查询的数据可读:
def __repr__(self):
return "<User(name='%s', password='%s')>" % (self.name, self.password) #在User类里添加
my_user = Session.query(User.name,User.password).all()
print(my_user)

外键关联:

from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column,String,Integer,ForeignKey,DATE
from sqlalchemy.orm import sessionmaker,relationship
from sqlalchemy import func
engine = create_engine('mysql+pymysql://cheng:123456@192.168.71.3/test_cheng',
encoding = 'utf-8') Base = declarative_base()
class Student(Base):
__tablename__ = 'student'
id = Column(Integer,primary_key=True)
name = Column(String(32),nullable=False)
data = Column(DATE,nullable=False) def __repr__(self):
return 'id:%s,name:%s'%(self.id,self.name) class Study_record(Base):
__tablename__ = 'study_record'
id = Column(Integer,primary_key=True)
day = Column(Integer,nullable=False)
status = Column(String(32),nullable=False)
stu_id = Column(Integer,ForeignKey('student.id')) #创建外键关联 student = relationship('Student',backref='my_study_record') #允许你在student表里通过backref字段反向查出study_record表里的字段。
def __repr__(self):
#return 'id:%s,day:%s,stu_id:%s'%(self.id,self.day,self.stu_id)
return 'id:%s,day:%s,stu_id:%s' % (self.id, self.day, self.student.name) #通过self.student.name调出student表里name字段的值。
Base.metadata.create_all(engine) Session_class = sessionmaker(bind=engine)
Session = Session_class()
data = Session.query(Student).filter(Student.name=='cheng').first() #查出name等于cheng的学生,再打印出Study_record类里repr的返回值。
print(data.my_study_record) # stu_obj = Student(name='cheng1',data = '2017-11-01')
# record_obj = Study_record(day=2,status ='yes',stu_id=3) #插入数据时先创建student表里的主键,在创建study_record的外键,因为有外键约束
# Session.add_all([record_obj])
# Session.commit()

多外键关联:

from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column,String,Integer,ForeignKey,DATE
from sqlalchemy.orm import sessionmaker,relationship
engine = create_engine('mysql+pymysql://cheng:123456@192.168.71.3/test_cheng?charset=utf8',
encoding='utf-8') Base = declarative_base() class Customer(Base):
__tablename__ = 'customer'
id = Column(Integer, primary_key=True)
name = Column(String(32))
billing_address_id = Column(Integer, ForeignKey("address.id"))
shipping_address_id = Column(Integer, ForeignKey("address.id")) billing_address = relationship("Address", foreign_keys=[billing_address_id])
shipping_address = relationship("Address", foreign_keys=[shipping_address_id]) class Address(Base):
__tablename__ = 'address'
id = Column(Integer, primary_key=True)
street = Column(String(32))
city = Column(String(32))
state = Column(String(32))
Base.metadata.create_all(engine) Session_class = sessionmaker(bind=engine)
Session = Session_class()
#address_obj = Address(street ='tongzhou1',city ='beijing2',state='beijing3')
address_obj = Address(street ='通州',city ='北京',state='北京')
Session.add_all([address_obj])
customer_obj = Customer(name='chengll',billing_address=address_obj,shipping_address=address_obj) #通过以上关联,可以这样进行赋值
Session.add_all([customer_obj])
Session.commit()

多对多:

from sqlalchemy import Table, Column, Integer,String,DATE, ForeignKey
from sqlalchemy.orm import relationship
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker engine = create_engine('mysql+pymysql://root:ccc949885111@192.168.71.3/cuichao?charset=utf8',encoding='utf-8')
Base = declarative_base() book_m2m_author = Table('book_m2m_author', Base.metadata,
Column('book_id',Integer,ForeignKey('books.id')),
Column('author_id',Integer,ForeignKey('authors.id')),
)
class Book(Base):
__tablename__ = 'books'
id = Column(Integer,primary_key=True)
name = Column(String(64))
pub_date = Column(DATE)
authors = relationship('Author',secondary=book_m2m_author,backref='books')
def __repr__(self):
return self.name class Author(Base):
__tablename__ = 'authors'
id = Column(Integer, primary_key=True)
name = Column(String(32))
def __repr__(self):
return self.name
Base.metadata.create_all(engine) Session_class = sessionmaker(bind=engine) # 创建与数据库的会话session class ,注意,这里返回给session的是个class,不是实例
s = Session_class() # 生成session实例 b1 = Book(name="跟Alex学Python")
b2 = Book(name="跟Alex学把妹")
b3 = Book(name="跟Alex学装逼")
b4 = Book(name="跟Alex学开车") a1 = Author(name="Alex")
a2 = Author(name="Jack")
a3 = Author(name="Rain") b1.authors = [a1, a2]
b2.authors = [a1, a2, a3] s.add_all([b1, b2, b3, b4, a1, a2, a3]) s.commit()
# print('--------通过书表查关联的作者---------')
#
# book_obj = s.query(Book).filter_by(name="跟Alex学Python").first()
# print(book_obj.name, book_obj.authors)
#
# print('--------通过作者表查关联的书---------')
# author_obj = s.query(Author).filter_by(name="Alex").first()
# print(author_obj.name, author_obj.books)
# s.commit()

Python 9 sqlalchemy ORM的更多相关文章

  1. python之SQLAlchemy ORM 上

    前言: SQLAlchmey是暑假学的,当时学完后也没及时写博客整理下.这篇博客主要介绍下SQLAlchemy及基本操作,写完后有空做个堡垒机小项目.下篇博客整理写篇关于Web框架和django基础~ ...

  2. python之SQLAlchemy ORM

    前言: 这篇博客主要介绍下SQLAlchemy及基本操作,写完后有空做个堡垒机小项目.有兴趣可看下python之数据库(mysql)操作.下篇博客整理写篇关于Web框架和django基础~~ 一.OR ...

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

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

  4. python 之路,Day11 (下)- sqlalchemy ORM

    python 之路,Day11 - sqlalchemy ORM   本节内容 ORM介绍 sqlalchemy安装 sqlalchemy基本使用 多外键关联 多对多关系 表结构设计作业 1. ORM ...

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

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

  6. SQLAlchemy(1) -- Python的SQLAlchemy和ORM

    Python的SQLAlchemy和ORM(object-relational mapping:对象关系映射) web编程中有一项常规任务就是创建一个有效的后台数据库.以前,程序员是通过写sql语句, ...

  7. 关于ORM,以及Python中SQLAlchemy的sessionmaker,scoped_session

    orm(object relational mapping):对象关系映射. python面向对象,而数据库是关系型. orm是将数据库关系映射为Python中的对象,不用直接写SQL. 缺点是性能略 ...

  8. Python SQLAlchemy ORM示例

    SQLAlchemy的是Python的SQL工具包和对象关系映射,给应用程序开发者提供SQL的强大功能和灵活性. 安装 pip install mysql-python pip install sql ...

  9. Sqlalchemy python经典第三方orm

    Ⅰ. 安装 pip install sqlalchemy Ⅱ. 起步链接 import time import threading import sqlalchemy from sqlalchemy ...

随机推荐

  1. nginx服务器部署

    nginx(“engine x”)是一个高性能的HTTP和反向代理服务器.   安装nginx Linux下  sudo apt-get install nginx windows下 下载 nginx ...

  2. layui表格的批量删除功能

    // 批量删除功能 // 1.得到table选中行内容 // 2.得到删除需要的唯一值,一般是id; // 3.将所要删除的项加入到数组中: // 4.判断是否选中: // 5.发送ajax请求,并附 ...

  3. ConcurrentHashMap的JDK1.8实现

    今天我们介绍一下ConcurrentHashMap在JDK1.8中的实现.基本结构 ConcurrentHashMap在1.8中的实现,相比于1.7的版本基本上全部都变掉了.首先,取消了Segment ...

  4. 基于AFNetworking封装的网络请求工具类【原创】

    今天给大家共享一个我自己封装的网络请求类,希望能帮助到大家. 前提,导入AFNetworking框架, 关于修改AFN源码:通常序列化时做对text/plan等的支持时,可以一劳永逸的修改源代码,在a ...

  5. 【转】Silverlight全开源工作流设计器

    声明 此工作流是作者自行构思和设计的被动式数据触发模式的工作流.没有遵循各种现有的工作流设计标准(如WFMC或WSFL),也没有与其他工作流通用性的接口规范.这里体现更多的是作者对工作流的使用思想,及 ...

  6. Codeforces 455A Boredom 取数字的dp

    题目链接:点击打开链接 给定一个n长的序列 删除x这个数就能获得x * x的个数 的分数,然后x+1和x-1这2个数会消失.即无法获得这2个数的分数 问最高得分. 先统计每一个数出现的次数.然后dp一 ...

  7. day10上节内容补充和初始函数

    1.上节内容补充 文件的删除和修改: #文件的删除和修改 #文件中全部都要修改 # with open('歌词',encoding='utf-8') as f1,open('歌词.bak','w',e ...

  8. The E-pang Palace(暴力几何)

    //暴力的几何题,问,n个点可以组成的矩形,不相交,可包含的情况下,最大的面积,还有就是边一定与 x y 轴平行,所以比较简单了 //暴力遍历对角线,搜出所有可能的矩形,然后二重循环所有矩形,判断一下 ...

  9. EasyPlayer.js网页全终端播放器安装使用文档

    EasyPlayer.js 集 rtmp, hls, flv, websocket 于一身的网页直播/点播播放器, 使用简单, 功能强大 属性(Property) video-url 视频流地址 St ...

  10. 【转】.Net 程序集 签名工具sn.exe 密钥对SNK文件 最基本的用法

    阐述签名工具这个概念之前,我先说说它不是什么: 1.它不是用于给程序集加密的工具,它与阻止Reflector或ILSpy对程序集进行反编译一毛钱关系都没有. 2.它很讨厌人们把它和加密联系在一起. 我 ...