一、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. 使用pycharm手动搭建python语言django开发环境 - 使用git管理代码(二)

    在pycharm中打开项目,使用File->Version Control->Git.选中git的安装路径并点击确认. 2)在Version Control界面中,配置或新建一个git的主 ...

  2. 使用.NET Reflector 查看Unity引擎里面的DLL文件

    转载标注来源哦! 原地址在这里!在这里. 当你查看unity里面API的时候.是不是有时候追踪了一两步就碰到DLL文件走不下去了呢?非常是不爽吧. 这样的问题我也是常常碰到.这是人家商业引擎不想让你看 ...

  3. Android Studio Error -- Could not create the Java Virtual Machine

    :app:dexDebug Error: Could not create the Java Virtual Machine. Error: A fatal exception has occurre ...

  4. ios --也是在B页面的生命周期设置如下代码。方法一是直接关闭和激活侧滑手势,方法二则是B遵循协议UIGestureRecognizerDelegate,设置侧滑交互代理,重写手势方法。

    @property (weak, nonatomic) id<UIGestureRecognizerDelegate> restoreInteractivePopGestureDelega ...

  5. JDK的命令具体解释操作

    JDK的命令具体解释1 rmic 功能说明: rmic 为远程对象生成 stub 和 skeleton. 语法: rmic [ options ] package-qualified-class-na ...

  6. 谈抽象1——无脑copy等于自杀

    近期被外派帮助国内某公司做政府某部门OA系统.听说他们那有个成熟的java框架,使用了非常长时间,抱着学习的态度,我进入这个公司.当我熟悉了一周后,留下了非常多疑问,而这些疑问,也诱发了这次关于&qu ...

  7. Linux - Ubuntu Server基础

    Ubuntu Server:部署环境,用来部署项目的server系统. XShell:用来连接linux的工具.web项目要部署到远程服务器上,所以需要XShell来连接远程服务器. pycharm: ...

  8. css单行排版

    text-overflow: ellipsis; overflow: hidden; white-space: nowrap;

  9. StartCom免费ssl证书申请以及在Tomcat环境中的配置

    提示:建议以下操作不使用谷歌浏览器(该网站的证书不识别...),可以看到我的截图中谷歌换成了ie(没装火狐)...建议该申请使用火狐 前面介绍了下自签名的ssl证书,虽然可以实现https协议访问,但 ...

  10. 解决CSS3多列样式column-width布局时内容被截断、错乱

    一.问题 使用CSS3的column-width: auto | <length>属性时,出现排列的内容被截断,出现错位的现象. 二.原因 需要为图片容器设置高度,不然会崩掉. 三.解决方 ...