pymysql

pymsql是Python中操作MySQL的模块,其使用方法和MySQLdb几乎相同。

1、下载安装

pip3 install pymysql

2、操作数据库

(1)、执行sql

#!/usr/bin/env python
# -*- coding:utf- -*-
import pymysql # 创建连接
conn = pymysql.connect(host='127.0.0.1', port=, user='root', passwd='', db='t1')
# 创建游标
cursor = conn.cursor() # 执行SQL,并返回收影响行数
effect_row = cursor.execute("update hosts set host = '1.1.1.2'") # 执行SQL,并返回受影响行数
#effect_row = cursor.execute("update hosts set host = '1.1.1.2' where nid > %s", (,)) # 执行SQL,并返回受影响行数
#effect_row = cursor.executemany("insert into hosts(host,color_id)values(%s,%s)", [("1.1.1.11",),("1.1.1.11",)]) # 提交,不然无法保存新建或者修改的数据
conn.commit() # 关闭游标
cursor.close()
# 关闭连接
conn.close()

(2)、获取新创建数据自增ID

#!/usr/bin/env python
# -*- coding:utf- -*-
import pymysql conn = pymysql.connect(host='127.0.0.1', port=, user='root', passwd='', db='t1')
cursor = conn.cursor()
cursor.executemany("insert into hosts(host,color_id)values(%s,%s)", [("1.1.1.11",),("1.1.1.11",)])
conn.commit()
cursor.close()
conn.close() # 获取最新自增ID
new_id = cursor.lastrowid

(3)、获取查询数据

#!/usr/bin/env python
# -*- coding:utf- -*-
import pymysql conn = pymysql.connect(host='127.0.0.1', port=, user='root', passwd='', db='t1')
cursor = conn.cursor()
cursor.execute("select * from hosts") # 获取第一行数据
row_1 = cursor.fetchone() # 获取前n行数据
# row_2 = cursor.fetchmany()
# 获取所有数据
# row_3 = cursor.fetchall() conn.commit()
cursor.close()
conn.close()

注:在fetch数据时按照顺序进行,可以使用cursor.scroll(num,mode)来移动游标位置,如:

  • cursor.scroll(1,mode='relative')  # 相对当前位置移动
  • cursor.scroll(2,mode='absolute') # 相对绝对位置移动

(4)、fetch数据类型

  关于默认获取的数据是元祖类型,如果想要或者字典类型的数据,即:

#!/usr/bin/env python
# -*- coding:utf- -*-
import pymysql conn = pymysql.connect(host='127.0.0.1', port=, user='root', passwd='', db='t1') # 游标设置为字典类型
cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
r = cursor.execute("call p1()") result = cursor.fetchone() conn.commit()
cursor.close()
conn.close()

sqlalchemy简介

SQLAlchemy是Python编程语言下的一款开源软件。提供了SQL工具包及对象关系映射(ORM)工具,使用MIT许可证发行。

SQLAlchemy“采用简单的Python语言,为高效和高性能的数据库访问设计,实现了完整的企业级持久模型”。SQLAlchemy的理念是,SQL数据库的量级和性能重要于对象集合;而对象集合的抽象又重要于表和行。因此,SQLAlchmey采用了类似于JavaHibernate的数据映射模型,而不是其他ORM框架采用的Active Record模型。不过,Elixir和declarative等可选插件可以让用户使用声明语法。

SQLAlchemy与数据库关系图如下:

sqlalchemy基本操作

一、安装sqlalchemy

  • 本文采用的是mysql案例,所以需要一台有安装mysql数据库的机器
  • 使用python的pip3安装 pip3 install sqlalchemy

安装完后查看版本信息

import sqlalchemy
sqlalchemy.__version__

二、连接数据库

在sqlalchemy中,session用于创建程序与数据库之间的会话。所有对象的载入和保存都需要通过session对象。

from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker # 链接数据库采用pymysq模块做映射,后面参数是最大连接数5
ENGINE=create_engine("mysql+pymysql://root@127.0.0.1:3306/digchouti?charset=utf8", max_overflow=)
Session = sessionmaker(bind=engine) session = Session()

三、创建映射(创建表)

一个映射对应着一个Python类,用来表示一个表的结构。下面创建一个person表,包括id和name两个字段。也就是说创建表就是用python的的类来实现

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@127.0.0.1:3306/digchouti?charset=utf8", max_overflow=) #生成一个SQLORM基类,创建表必须继承他,别问我啥意思就是这么规定的
Base = declarative_base() class Person(Base):
__tablename__ = 'userinfo' id = Column(Integer, primary_key=True)
name = Column(String()) def __repr__(self):
return "<Person(name='%s')>" % self.name

此代码是创建了一个名字叫userinfo的表,表里有两列,一列是id,一列是name。

四、添加数据

当然我们创建了表,肯定也要添加数据,代码如下:

#创建一个person对象
person = Person(name='张岩林')
#添加person对象,但是仍然没有提交到数据库
session.add(person)
#提交数据库
session.commit()

当然还能添加多条数据:

session.add_all([
Person(name='张岩林'),
Person(name='aylin')
])
session.commit()

五、查找数据

在sqlalchemy模块中,查找数据给提供了query()的方法 下面我就把能用到的给列举一下:

#获取所有数据
session.query(Person).all() #获取name=‘张岩林’的那行数据
session.query(Person).filter(Person.name=='张岩林').one() #获取返回数据的第一行
session.query(Person).first() #查找id大于1的所有数据
session.query(Person.name).filter(Person.id>).all() #limit索引取出第一二行数据
session.query(Person).all()[:] #order by,按照id从大到小排列
session.query(Person).ordre_by(Person.id) #equal/like/in
query = session.query(Person)
query.filter(Person.id==).all()
query.filter(Person.id!=).all()
query.filter(Person.name.like('%ay%')).all()
query.filter(Person.id.in_([,,])).all()
query.filter(~Person.id.in_([,,])).all()
query.filter(Person.name==None).all() #and or
from sqlalchemy import and_
from sqlalchemy import or_
query.filter(and_(Person.id==, Person.name=='张岩林')).all()
query.filter(Person.id==, Person.name=='张岩林').all()
query.filter(Person.id==).filter(Person.name=='张岩林').all()
query.filter(or_(Person.id==, Person.id==)).all() # count计算个数
session.query(Person).count() # 修改update
session.query(Person).filter(id > ).update({'name' : '张岩林'})
# 通配符
ret = session.query(Users).filter(Users.name.like('e%')).all()
ret = session.query(Users).filter(~Users.name.like('e%')).all() # 限制
ret = session.query(Users)[:] # 排序
ret = session.query(Users).order_by(Users.name.desc()).all()
ret = session.query(Users).order_by(Users.name.desc(), Users.id.asc()).all() # 分组
from sqlalchemy.sql import func ret = session.query(Users).group_by(Users.extra).all()
ret = session.query(
func.max(Users.id),
func.sum(Users.id),
func.min(Users.id)).group_by(Users.name).all() ret = session.query(
func.max(Users.id),
func.sum(Users.id),
func.min(Users.id)).group_by(Users.name).having(func.min(Users.id) >).all() # 连表 ret = session.query(Users, Favor).filter(Users.id == Favor.nid).all() ret = session.query(Person).join(Favor).all() ret = session.query(Person).join(Favor, isouter=True).all() # 组合
q1 = session.query(Users.name).filter(Users.id > )
q2 = session.query(Favor.caption).filter(Favor.nid < )
ret = q1.union(q2).all() q1 = session.query(Users.name).filter(Users.id > )
q2 = session.query(Favor.caption).filter(Favor.nid < )
ret = q1.union_all(q2).all()

查询这块比较多,可能写的不全还望各位见谅,剩下我相信大家都能扩展起来

上面的介绍完了,可能各位还不能吧融合到一块去,下面我给大家融合写在一块吧:

from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column
from sqlalchemy import Integer, String, TIMESTAMP
from sqlalchemy import ForeignKey, UniqueConstraint, Index
from sqlalchemy.orm import sessionmaker, relationship
from sqlalchemy import create_engine ENGINE=create_engine("mysql+pymysql://root@127.0.0.1:3306/digchouti?charset=utf8", max_overflow=5) Base = declarative_base() class Person(Base):
__tablename__ = 'userinfo' id = Column(Integer, primary_key=True)
name = Column(String(32)) def __repr__(self):
return "<Person(name='%s')>" % self.name #创建连接数据库以供提交用,至此表会创建完成,可以去数据库里面查看
Base.metadata.create_all(ENGINE)
Session = sessionmaker(bind=engine)
# 往里面插入多条数据
session = Session()
session.add_all([
Person(name='张岩林'),
Person(name='很帅')
])
session.commit()

sqlalchemy表关系之高级用法

上面阐述的是对于一张表的操作,下面将说的是表关系的一对多,多对多,了解数据库的都知道外键,也就是表关系建立。

1、一对多外键(1)

第一种方法我们只用到普通的操作,这个方式相对于好理解,在第一张表创建完,插入数据然后要记得提交数据,然后往第二章表创建数据的时候,可以直接拿第一张相关联的数据,代码如下:

#!/usr/bin/env python
# -*- coding:utf-8 -*- from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column,Integer,ForeignKey,UniqueConstraint,Index,String
from sqlalchemy.orm import sessionmaker,relationship
from sqlalchemy import create_engine engine=create_engine('mysql+pymysql://root@127.0.0.1:3306/db1') Base = declarative_base() class Son(Base):
__tablename__ = 'son'
id = Column(Integer,primary_key=True)
name = Column(String(32))
age = Column(String(32))
# 创建外键,对应父亲那张表的id项
father_id = Column(Integer,ForeignKey('father.id')) class Father(Base):
__tablename__ = 'father'
id = Column(Integer,primary_key=True)
name = Column(String(32))
age = Column(String(32)) Base.metadata.create_all(engine)
Session = sessionmaker(bind=engine)
session = Session() f1 = Father(name = 'zhangyanlin',age = '')
session.add(f1)
session.commit() w1 = Son(name = 'xiaozhang1',age = 3,father_id = 1)
w2 = Son(name = 'xiaozhang2',age = 3,father_id = 1) session.add_all([w1,w2])
session.commit()

2、一对多外键(2)relationship

第二种方法和第一种一样,只是这里改用了relationship来做外键关系,代码如下:

#!/usr/bin/env python
# -*- coding:utf-8 -*- from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column,Integer,ForeignKey,UniqueConstraint,Index,String
from sqlalchemy.orm import sessionmaker,relationship
from sqlalchemy import create_engine engine = create_engine('mysql+pymysql://root@127.0.0.1:3306/db1') Base = declarative_base() class Son(Base):
__tablename__ = 'son'
id = Column(Integer,primary_key=True)
name = Column(String(32))
age = Column(String(32)) father_id = Column(Integer,ForeignKey('father.id')) class Father(Base):
__tablename__ = 'father'
id = Column(Integer,primary_key=True)
name = Column(String(32))
age = Column(String(32))
son = relationship('Son') Base.metadata.create_all(engine)
Session = sessionmaker(bind=engine)
session = Session() f1 = Father(name = 'zhangyanlin',age = '') w1 = Son(name = 'xiaozhang1',age = '')
w2 = Son(name = 'xiaozhang2',age = '')
# 重点是这里绑定关系
f1.son = [w1,w2]
# 只需要把父亲给传进去,儿子的自然就上传进去啦
session.add(f1)
session.commit()

python数据库操作之pymysql模块和sqlalchemy模块(项目必备)的更多相关文章

  1. python数据库操作 - MySQL入门【转】

    python数据库操作 - MySQL入门 python学院 2017-02-05 16:22 PyMySQL是Python中操作MySQL的模块,和之前使用的MySQLdb模块基本功能一致,PyMy ...

  2. python/数据库操作补充—模板—Session

    python/数据库操作补充—模板—Session 一.创建一个app目录 在models.py只能类进行进行创建表 class Foo: xx= 字段(数据库数据类型) 字段类型 字符串 Email ...

  3. Python的数据库操作(pymysql)

    使用原生SQL语句进行对数据库操作,可完成数据库表的建立和删除,及数据表内容的增删改查操作等.其可操作性很强,如可以直接使用“show databases”.“show tables”等语句进行表格之 ...

  4. python学习之-- mysql模块和sqlalchemy模块

    简单介绍python下操作mysql数据库模块有2个:pyhton-mysqldb  和 pymysql 说明:在python3中支持mysql 的模块已经使用pymysql替代了MysqlDB(这个 ...

  5. Python之操作Redis、 RabbitMQ、SQLAlchemy、paramiko、mysql

    一.Redis Redis是一个开源的使用ANSI C语言编写.支持网络.可基于内存亦可持久化的日志型.Key-Value数据库,并提供多种语言的API.Redis是一个key-value存储系统.和 ...

  6. python 数据库操作类

    #安装PyMySQL:pip3 install PyMySQL   #!/usr/bin/python3   #coding=utf-8   #数据库操作类     from  datetime  i ...

  7. python数据库操作pymysql

    安装数据库: pip3 install pymysql 进行数据库的更新.插入.查询等操作: #!/usr/bin/python3.4 # -*- coding: utf-8 -*- #------- ...

  8. python数据库操作——sqlite3模块

    # -*- coding: utf-8 -*- ''' Version : Python27 Author : Spring God Date : 2012-4-26 ''' import sqlit ...

  9. python数据库操作

    python操作数据库应该比java更简单些,连接数据库需要有驱动,pcat就推荐自己遇到的3个模块:mysql.connector.sqlalchemy.MySQLdb

随机推荐

  1. ubuntu14.04如何卸载qq

    ubuntu安装了wine qq怎么去卸载呢?现在wine qq 比较好用的有ubuntukylin官网与deepin linux官网使用的deepin版本wine qq 2012国际版,还有Long ...

  2. GNU LIBC源代码学习之strcmp

    比較两个字符串 我的代码块 #include <string.h> int my_strcmp(const char* s1,const char * s2) { if((s1==NULL ...

  3. centos 7 修改主机名称

    hostnamectl --static set-hostname <host-name> 参考资料 http://www.centoscn.com/CentOS/config/2014/ ...

  4. contentProvider模板

    package com.example.qunzheng.todolist.provider; import android.content.ContentProvider; import andro ...

  5. VMware虚拟机安装Linux英文改中文系统并更新yum安装输入法

    今天用VMware Workstation11时,出现了个"难题",在选择了系统盘后(我用iso镜像centos6.5)VMware会提示高速安装,安装后系统是英文版,并且找不到系 ...

  6. Spring – Sending E-Mail Via Gmail SMTP Server With MailSender--reference

    Spring comes with a useful ‘org.springframework.mail.javamail.JavaMailSenderImpl‘ class to simplify ...

  7. 瀑布流AJAX无刷新加载数据列表--当页面滚动到Id时再继续加载数据

    瀑布流加载显示数据,在当下已经用的很普遍,尤其是我们在做网上商城时,在产品列表页面已经被普遍使用. 对于实现瀑布流布局的解决方案主要有以下两种方式: 1.对每一条显示数据使用绝对定位+浮动的方式,这样 ...

  8. js 注册手机摇动事件

    var rockModule = (function () { //监听手机摇动事件 if (window.DeviceMotionEvent) { window.addEventListener(' ...

  9. SQL Server 2008导入、导出数据库

    SQL Server 2008数据库的导入.导出和Mysql的导出还有一定的区别,刚开始的时候完全摸不到方向,利用Microsoft SQL Server Management Studio进行导入. ...

  10. C# 调用Java Webservice 加入SoapHeader 验证信息

    C#调用java 编写的webservice时不会自动生成 soapheader 类接口的,需要改动Reference.cs. 在生成的代理类referende.cs中进行如下操作: 一.在声明pub ...