前言

  其实一开始写blog,我是拒绝的,但是,没办法,没有任何理由抗拒。今天呢,要说的就是如何使用Python来操作数据库。

SQLAlchemy

SQLAlchemy是Python编程语言下的一款ORM框架,该框架建立在数据库API智商,使用关系对象映射进行数据库操作,换句话说就是:将对象转换成SQL,然后使用数据API执行SQL语句并获取到执行结果。

以前我们常用pymysql来操作数据库,举个栗子

(需要提前安装上pymysql)

#!/usr/bin/env python
# -*- coding:utf-8 -*-
# Author: Leon xie import pymysql #创建连接
conn = pymysql.connect(host='192.168.56.11',port=3306,user='root',passwd='root',db='oldboydb')
#创建游标 socket上建立的实例
cursor=conn.cursor() #执行SQL,并返回行数,用游标执行,
effect_row = cursor.execute("select * from student")
# print(cursor.fetchone())
# print(cursor.fetchone())
print(cursor.fetchall())

这样就可以把数据全部取出来。

插入数据呢?

#!/usr/bin/env python
# -*- coding:utf- -*-
# Author: Leon xie import pymysql #创建连接
conn = pymysql.connect(host='192.168.56.11',port=,user='root',passwd='root',db='oldboydb')
#创建游标 socket上建立的实例
cursor=conn.cursor() #执行SQL,并返回行数,用游标执行,
#effect_row = cursor.execute("select * from student")
# print(cursor.fetchone())
# print(cursor.fetchone())
# print(cursor.fetchall()) data = [
("N1","2015-05-22",'M'),
("N2","2015-05-22",'M'),
("N3","2015-05-22",'M'),
("N4","2015-05-22",'M'),
] cursor.executemany("insert into student (name,register_date,gender) values(%s,%s,%s)",data ) conn.commit()
有个问题,上面需要我写原生的SQL语句来使用。如果写原生,自己增删改,如果简单还行,复杂就很麻烦了,重用性不强,因为都是写死在里面,如果数据库结果变化就的改,对扩展什么都不方便,包括
SQL水平也就一般般,很多情况写不出高效的SQL语句,涉及到软件好慢好慢,加机器都不好使。
为了避免,我们把原生SQL写死到源代码里,怎么办呢?就要引入下面的东西。
SQLAlchemy是python编程语言下的一款ORM框架,该框架建立在数据库API之上,使用关系对象映射进行数据库操作。简言之便是:将对象转换成SQL,然后使用数据API执行SQL并获取执行结果。
这样,就不用写原生的SQL了。

所以我们引入了ORM,什么是ORM?

ORM就是对象映射关系程序。相当于ORM帮我们把对象里的转化成SQL然后跟数据库交互

ORM的优点:

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

2、ORM使我们构造固化数据结构变得简单易行。

缺点:

1、无可避免,自动化意味着映射和关联管理,代价是牺牲性能

ORM是一个术语,不是一个软件,基于ORM的标准下,有很多软件,最执行的就是SQLAlchemy ,(SQL 阿哥迷)

如何使用?

windows下安装

pip install sqlalchemy

接下来利用ORM实现一个创建表的功能

#!/usr/bin/env python
# -*- coding:utf- -*-
# Author: Leon xie 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://root:root@192.168.56.11/oldboydb",encoding='utf-8',echo=True)
#echo=True,就是把整个过程打印出来
Base=declarative_base() #生成ORM基类 class User(Base):
__tablename__ = 'user' #表名
id = Column(Integer,primary_key=True) #字段,整形,主键 column是导入的
name = Column(String())
password = Column(String()) Base.metadata.create_all(engine) #创建表结构

实现结果,就是在数据库创建了一个表,user,再次执行,如果数据库有,它就不会创建了。

插入数据

'''
创建数据,有个游标的东西叫做sessionmaker需要单独导入
''' #实例与socket绑定,创建与数据库的绘画session class,注意,这里返回
#给session的是一个class,不是实例
Session_class = sessionmaker(bind=engine)
#生成session实例,cursor
Session = Session_class() #生产你要创建的数据对象
xiedi_obj = User(name="alex",password="")
xiedi_obj2 = User(name="jack",password="")
#目前还没有创建对象,可以打印看看,上面只是申明
print(xiedi_obj.name,xiedi_obj.id) #把要创建的数据对象添加到这个session里,一会同一创建
Session.add(xiedi_obj)
Session.add(xiedi_obj2)
#这里依旧没有创建
print(xiedi_obj.name,xiedi_obj.id) #现在才同一提交,创建数据
Session.commit()

查询

#!/usr/bin/env python
# -*- coding:utf- -*-
# Author: Leon xie '''
利用ORM实现一个创建表的功能
'''
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://root:root@192.168.56.11/oldboydb",encoding='utf-8')
Base = declarative_base() #生成ORM基类
#创建表结构
class User(Base):
__tablename__ = 'xiedi' #表名
id = Column(Integer,primary_key=True)
name = Column(String())
password = Column(String()) def __repr__(self):
return "<%s name:%s>" % (self.id,self.name) #直接调用基类下的方法,创建表结构
Base.metadata.create_all(engine)
'''
查看
'''
T1 = sessionmaker(bind=engine)
T2 = T1()
#filter查出来的是一组数据,它不知道你要查多少
data = T2.query(User).filter_by().all()
print(data)
打印结果
[<1 name:alex>, <2 name:jack>]

修改,原理就是搜索出来,然后赋值

data = Session.query(User).filter(User.id>).filter(User.id<).first()
print(data)
data.name = "Jack Liu"
data.password = "Shit happens"
#提交
Session.commit()

统计

#!/usr/bin/env python
# -*- coding:utf- -*-
# Author: Leon xie '''
利用ORM实现一个创建表的功能
''' 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://root:root@192.168.56.11/oldboydb",encoding='utf-8')
Base = declarative_base() #生成ORM基类 #创建表结构
class User(Base):
__tablename__ = 'xiedi' #表名
id = Column(Integer,primary_key=True)
name = Column(String())
password = Column(String()) #直接调用基类下的方法
Base.metadata.create_all(engine) #实例与socket绑定,创建与数据库的绘画session class,注意,这里返回
#给session的是一个class,不是实例
Session_class = sessionmaker(bind=engine)
#生成session实例,cursor
Session = Session_class() #创建用户
fake_user = User(name='rain',password="")
Session.add(fake_user) print(Session.query(User).filter(User.name.in_(['xiedi','rain','jack'])).all()) Session.rollback()
print(Session.query(User).filter(User.name.in_(['xiedi','rain','jack'])).all()) print(Session.query(User).filter(User.name.in_(['Jack','rain'])).count())
打印结果

那么如何取分组呢?统计每个名字出现多少次

#!/usr/bin/env python
# -*- coding:utf- -*-
# Author: Leon xie '''
利用ORM实现一个创建表的功能
'''
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://root:root@192.168.56.11/oldboydb",encoding='utf-8')
Base = declarative_base() #生成ORM基类
#创建表结构
class User(Base):
__tablename__ = 'xiedi' #表名
id = Column(Integer,primary_key=True)
name = Column(String())
password = Column(String())
#直接调用基类下的方法,创建表结构
Base.metadata.create_all(engine) '''
创建数据,有个游标的东西叫做sessionmaker需要单独导入
''' #实例与socket绑定,创建与数据库的绘画session class,注意,这里返回
#给session的是一个class,不是实例
Session_class = sessionmaker(bind=engine)
#生成session实例,cursor
Session = Session_class() from sqlalchemy import func print(Session.query(User.name,func.count(User.name)).group_by(User.name).all())
打印结果
[('alex', , 'alex'), ('Jack Liu', , 'Jack Liu')]

外键关联

#!/usr/bin/env python
# -*- coding:utf- -*-
# Author: Leon xie import sqlalchemy from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column,Integer,String,DATE,Enum
from sqlalchemy.orm import sessionmaker engine = create_engine("mysql+pymysql://root:root@192.168.56.11/oldboydb",encoding='utf-8')
#echo=True,就是把整个过程打印出来
Base=declarative_base() #生成ORM基类
class User(Base):
__tablename__ = 'user' #表名
id = Column(Integer,primary_key=True) #字段,整形,主键 column是导入的
name = Column(String())
password = Column(String()) def __repr__(self):
return "<%s name:%s>" % (self.id,self.name) class Student(Base):
__tablename__ = 'student' #表名
id = Column(Integer,primary_key=True) #字段,整形,主键 column是导入的
name = Column(String(),nullable=False)
register_date = Column(DATE,nullable=False)
gender = Column(String(),nullable=False) def __repr__(self):
return "<%s name:%s>" % (self.id,self.name) Base.metadata.create_all(engine) #创建表结构 Session_class = sessionmaker(bind=engine)
Session = Session_class() # s1 = Student(name="s2",register_date="2015-03-01",gender="F")
# Session.add(s1) print(Session.query(User,Student).filter(User.id==Student.id).all())
Session.commit()

一个初学者的辛酸路程-python操作SQLAlchemy-13的更多相关文章

  1. 一个初学者的辛酸路程-Python基础-3

    前言 不要整天沉迷于学习-. 字典 一.我想跟你聊聊字典 1.为何要有字典? 大家有没有想过为什么要有字典?有列表不就可以了吗? 也许大家会这么认为,我给大家举个例子,大家就明白了. 比如说,我通讯录 ...

  2. 一个初学者的辛酸路程-了解Python-2

    前言 blog花了一上午写的,结果笔记本关机了,没有保存,找不到了,找不到了啊,所以说,你看的每一篇blog可能都是我写了2次以上的--.哎!! 代码改变世界,继续......... Python基础 ...

  3. 一个初学者的辛酸路程-依旧Django

    回顾: 1.Django的请求声明周期?   请求过来,先到URL,URL这里写了一大堆路由关系映射,如果匹配成功,执行对应的函数,或者执行类里面对应的方法,FBV和CBV,本质上返回的内容都是字符串 ...

  4. 一个初学者的辛酸路程-继续Django

    问题1:HTTP请求过来会先到Django的那个地方? 先到urls.py  ,里面写的是对应关系,1个URL对应1个函数名. 如果发URL请求过来,到达这里,然后帮你去执行指定的函数,函数要做哪些事 ...

  5. 一个初学者的辛酸路程-初识Django

    前言: 主要是关于JavaScript的高级部分以及Django 主要内容: 一.jQuery 事件绑定: DOM事件绑定: -直接在标签上绑定 第一种: $('.title').click(func ...

  6. 一个初学者的辛酸路程-FTP-9

    前言 今天,我要描述一个FTP的故事 主要内容 嗯,今天主要以阶梯性的形式来做一个FTP项目. 第一步: 我要实现这么一个功能,一个FTP客户端,1个FTP服务端,2端建立连接以后可以进行通讯. 服务 ...

  7. 一个初学者的辛酸路程-socket编程-8

    前言: 你会发现会网络是多么幸福的事情 主要内容: socket 概念: socket本质上就是2台网络互通的电脑之间,架设一个通道,两台电脑通过这个通道来实现数据的互相传递.我们知道网络通信都是基于 ...

  8. 一个初学者的辛酸路程-初识Python-1

    前言 很喜欢的一句话,与诸位共勉. 人的一切痛苦,本质上都是对自己无能的愤怒----王小波. 初识Python 一.它的爸爸是谁 首先,我们需要认识下面这位人物. 他是Python的创始人,吉多范罗苏 ...

  9. 一个初学者的辛酸路程-jQuery

    前言: 主要概要: 1.HTML+CSS补充 2.DOM事件 3.jQuery示例 内容概要: 1.布局 代码如下 <!DOCTYPE html> <html lang=" ...

随机推荐

  1. Memcache的一些学习

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

  2. openstack中的floating ip与阿里云的公网ip

    项目组因业务需求使用openstack搭建了一个私有云,本想在vm上搭建一个ftp.源是vsftpd.所有配置都完成了,在远程登录的时候却出现了 这个问题. 初一看以为是文件夹权限的问题,可上上下下全 ...

  3. Promise初体验

    想通过回调函数做一个动画效果:三个小球依次运动,第一个小球运动到指定位置后回调第二个小球运动,依次类推,效果如图所示: 到第三个小球到达指定位置再回调,让第二个小球往回移动,直到最后一个小球回到原位: ...

  4. iOS开发-内存管理

    内存管理 对于这篇呢,其实现在都是ARC模式,正常状态下基本不用我们去手动释放内存,所以如果不是要面试呀.装逼或者扎实功底的,就先别看了或者了解下即可,因为像面试时,有些面试官想看你的基础时,就有些人 ...

  5. iOS设置UITableView中Cell被默认选中后怎么触发didselect事件

    //默认选中某个cell [self.searchResultTV selectRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:0] a ...

  6. 【USACO】滑雪课程

    滑雪课程贝西去科罗拉多州去滑雪,不过还她不太会玩,只是个能力为 1 的渣渣.贝西从 0 时刻进入滑雪场,一到 T 时刻就必须离开.滑雪场里有 N 条斜坡,第 i 条斜坡滑行一次需要 Di 分钟,要求游 ...

  7. CentOS7 install vsftpd

    #mkdir -p /var/ftp/xcl/ #yum install -y vsftpd#useradd -g ftp -M -d /var/ftp/xcl -s /sbin/nologin xc ...

  8. RPC 框架原理详解

    首先了解什么叫RPC,为什么要RPC,RPC是指远程过程调用?也就是说两台服务器A,B,一个应用部署在A服务器上,想要调用B服务器上应用提供的函数/方法,由于不在一个内存空间,不能直接调用,需要通过网 ...

  9. 一步步优化JVM四:决定Java堆的大小以及内存占用

    到目前为止,还没有做明确的优化工作.只是做了初始化选择工作,比如说:JVM部署模型.JVM运行环境.收集哪些垃圾回收器的信息以及需要遵守垃圾回收原则.这一步将介绍如何评估应用需要的内存大小以及Java ...

  10. JSON跟JSONP的区别以及实战

    前言 由于Sencha Touch 2这种开发模式的特性,基本决定了它原生的数据交互行为几乎只能通过AJAX来实现. 当然了,通过调用强大的PhoneGap插件然后打包,你可以实现100%的Socke ...