pymysql

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

1、下载安装

  1. pip3 install pymysql

2、操作数据库

(1)、执行sql

  1. #!/usr/bin/env python
  2. # -*- coding:utf- -*-
  3. import pymysql
  4.  
  5. # 创建连接
  6. conn = pymysql.connect(host='127.0.0.1', port=, user='root', passwd='', db='t1')
  7. # 创建游标
  8. cursor = conn.cursor()
  9.  
  10. # 执行SQL,并返回收影响行数
  11. effect_row = cursor.execute("update hosts set host = '1.1.1.2'")
  12.  
  13. # 执行SQL,并返回受影响行数
  14. #effect_row = cursor.execute("update hosts set host = '1.1.1.2' where nid > %s", (,))
  15.  
  16. # 执行SQL,并返回受影响行数
  17. #effect_row = cursor.executemany("insert into hosts(host,color_id)values(%s,%s)", [("1.1.1.11",),("1.1.1.11",)])
  18.  
  19. # 提交,不然无法保存新建或者修改的数据
  20. conn.commit()
  21.  
  22. # 关闭游标
  23. cursor.close()
  24. # 关闭连接
  25. conn.close()

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

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

(3)、获取查询数据

  1. #!/usr/bin/env python
  2. # -*- coding:utf- -*-
  3. import pymysql
  4.  
  5. conn = pymysql.connect(host='127.0.0.1', port=, user='root', passwd='', db='t1')
  6. cursor = conn.cursor()
  7. cursor.execute("select * from hosts")
  8.  
  9. # 获取第一行数据
  10. row_1 = cursor.fetchone()
  11.  
  12. # 获取前n行数据
  13. # row_2 = cursor.fetchmany()
  14. # 获取所有数据
  15. # row_3 = cursor.fetchall()
  16.  
  17. conn.commit()
  18. cursor.close()
  19. conn.close()

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

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

(4)、fetch数据类型

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

  1. #!/usr/bin/env python
  2. # -*- coding:utf- -*-
  3. import pymysql
  4.  
  5. conn = pymysql.connect(host='127.0.0.1', port=, user='root', passwd='', db='t1')
  6.  
  7. # 游标设置为字典类型
  8. cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
  9. r = cursor.execute("call p1()")
  10.  
  11. result = cursor.fetchone()
  12.  
  13. conn.commit()
  14. cursor.close()
  15. 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

安装完后查看版本信息

  1. import sqlalchemy
  2. sqlalchemy.__version__

二、连接数据库

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

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

三、创建映射(创建表)

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

  1. import sqlalchemy
  2. from sqlalchemy import create_engine
  3. from sqlalchemy.ext.declarative import declarative_base
  4. from sqlalchemy import Column, Integer, String
  5. from sqlalchemy.orm import sessionmaker
  6.  
  7. ENGINE=create_engine("mysql+pymysql://root@127.0.0.1:3306/digchouti?charset=utf8", max_overflow=)
  8.  
  9. #生成一个SQLORM基类,创建表必须继承他,别问我啥意思就是这么规定的
  10. Base = declarative_base()
  11.  
  12. class Person(Base):
  13. __tablename__ = 'userinfo'
  14.  
  15. id = Column(Integer, primary_key=True)
  16. name = Column(String())
  17.  
  18. def __repr__(self):
  19. return "<Person(name='%s')>" % self.name

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

四、添加数据

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

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

当然还能添加多条数据:

  1. session.add_all([
  2. Person(name='张岩林'),
  3. Person(name='aylin')
  4. ])
  5. session.commit()

五、查找数据

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

  1. #获取所有数据
  2. session.query(Person).all()
  3.  
  4. #获取name=‘张岩林’的那行数据
  5. session.query(Person).filter(Person.name=='张岩林').one()
  6.  
  7. #获取返回数据的第一行
  8. session.query(Person).first()
  9.  
  10. #查找id大于1的所有数据
  11. session.query(Person.name).filter(Person.id>).all()
  12.  
  13. #limit索引取出第一二行数据
  14. session.query(Person).all()[:]
  15.  
  16. #order by,按照id从大到小排列
  17. session.query(Person).ordre_by(Person.id)
  18.  
  19. #equal/like/in
  20. query = session.query(Person)
  21. query.filter(Person.id==).all()
  22. query.filter(Person.id!=).all()
  23. query.filter(Person.name.like('%ay%')).all()
  24. query.filter(Person.id.in_([,,])).all()
  25. query.filter(~Person.id.in_([,,])).all()
  26. query.filter(Person.name==None).all()
  27.  
  28. #and or
  29. from sqlalchemy import and_
  30. from sqlalchemy import or_
  31. query.filter(and_(Person.id==, Person.name=='张岩林')).all()
  32. query.filter(Person.id==, Person.name=='张岩林').all()
  33. query.filter(Person.id==).filter(Person.name=='张岩林').all()
  34. query.filter(or_(Person.id==, Person.id==)).all()
  35.  
  36. # count计算个数
  37. session.query(Person).count()
  38.  
  39. # 修改update
  40. session.query(Person).filter(id > ).update({'name' : '张岩林'})
  1. # 通配符
  2. ret = session.query(Users).filter(Users.name.like('e%')).all()
  3. ret = session.query(Users).filter(~Users.name.like('e%')).all()
  4.  
  5. # 限制
  6. ret = session.query(Users)[:]
  7.  
  8. # 排序
  9. ret = session.query(Users).order_by(Users.name.desc()).all()
  10. ret = session.query(Users).order_by(Users.name.desc(), Users.id.asc()).all()
  11.  
  12. # 分组
  13. from sqlalchemy.sql import func
  14.  
  15. ret = session.query(Users).group_by(Users.extra).all()
  16. ret = session.query(
  17. func.max(Users.id),
  18. func.sum(Users.id),
  19. func.min(Users.id)).group_by(Users.name).all()
  20.  
  21. ret = session.query(
  22. func.max(Users.id),
  23. func.sum(Users.id),
  24. func.min(Users.id)).group_by(Users.name).having(func.min(Users.id) >).all()
  25.  
  26. # 连表
  27.  
  28. ret = session.query(Users, Favor).filter(Users.id == Favor.nid).all()
  29.  
  30. ret = session.query(Person).join(Favor).all()
  31.  
  32. ret = session.query(Person).join(Favor, isouter=True).all()
  33.  
  34. # 组合
  35. q1 = session.query(Users.name).filter(Users.id > )
  36. q2 = session.query(Favor.caption).filter(Favor.nid < )
  37. ret = q1.union(q2).all()
  38.  
  39. q1 = session.query(Users.name).filter(Users.id > )
  40. q2 = session.query(Favor.caption).filter(Favor.nid < )
  41. ret = q1.union_all(q2).all()

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

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

  1. from sqlalchemy.ext.declarative import declarative_base
  2. from sqlalchemy import Column
  3. from sqlalchemy import Integer, String, TIMESTAMP
  4. from sqlalchemy import ForeignKey, UniqueConstraint, Index
  5. from sqlalchemy.orm import sessionmaker, relationship
  6. from sqlalchemy import create_engine
  7.  
  8. ENGINE=create_engine("mysql+pymysql://root@127.0.0.1:3306/digchouti?charset=utf8", max_overflow=5)
  9.  
  10. Base = declarative_base()
  11.  
  12. class Person(Base):
  13. __tablename__ = 'userinfo'
  14.  
  15. id = Column(Integer, primary_key=True)
  16. name = Column(String(32))
  17.  
  18. def __repr__(self):
  19. return "<Person(name='%s')>" % self.name
  20.  
  21. #创建连接数据库以供提交用,至此表会创建完成,可以去数据库里面查看
  22. Base.metadata.create_all(ENGINE)
  23. Session = sessionmaker(bind=engine)
  24. # 往里面插入多条数据
  25. session = Session()
  26. session.add_all([
  27. Person(name='张岩林'),
  28. Person(name='很帅')
  29. ])
  30. session.commit()

sqlalchemy表关系之高级用法

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

1、一对多外键(1)

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

  1. #!/usr/bin/env python
  2. # -*- coding:utf-8 -*-
  3.  
  4. from sqlalchemy.ext.declarative import declarative_base
  5. from sqlalchemy import Column,Integer,ForeignKey,UniqueConstraint,Index,String
  6. from sqlalchemy.orm import sessionmaker,relationship
  7. from sqlalchemy import create_engine
  8.  
  9. engine=create_engine('mysql+pymysql://root@127.0.0.1:3306/db1')
  10.  
  11. Base = declarative_base()
  12.  
  13. class Son(Base):
  14. __tablename__ = 'son'
  15. id = Column(Integer,primary_key=True)
  16. name = Column(String(32))
  17. age = Column(String(32))
  18. # 创建外键,对应父亲那张表的id项
  19. father_id = Column(Integer,ForeignKey('father.id'))
  20.  
  21. class Father(Base):
  22. __tablename__ = 'father'
  23. id = Column(Integer,primary_key=True)
  24. name = Column(String(32))
  25. age = Column(String(32))
  26.  
  27. Base.metadata.create_all(engine)
  28. Session = sessionmaker(bind=engine)
  29. session = Session()
  30.  
  31. f1 = Father(name = 'zhangyanlin',age = '')
  32. session.add(f1)
  33. session.commit()
  34.  
  35. w1 = Son(name = 'xiaozhang1',age = 3,father_id = 1)
  36. w2 = Son(name = 'xiaozhang2',age = 3,father_id = 1)
  37.  
  38. session.add_all([w1,w2])
  39. session.commit()

2、一对多外键(2)relationship

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

  1. #!/usr/bin/env python
  2. # -*- coding:utf-8 -*-
  3.  
  4. from sqlalchemy.ext.declarative import declarative_base
  5. from sqlalchemy import Column,Integer,ForeignKey,UniqueConstraint,Index,String
  6. from sqlalchemy.orm import sessionmaker,relationship
  7. from sqlalchemy import create_engine
  8.  
  9. engine = create_engine('mysql+pymysql://root@127.0.0.1:3306/db1')
  10.  
  11. Base = declarative_base()
  12.  
  13. class Son(Base):
  14. __tablename__ = 'son'
  15. id = Column(Integer,primary_key=True)
  16. name = Column(String(32))
  17. age = Column(String(32))
  18.  
  19. father_id = Column(Integer,ForeignKey('father.id'))
  20.  
  21. class Father(Base):
  22. __tablename__ = 'father'
  23. id = Column(Integer,primary_key=True)
  24. name = Column(String(32))
  25. age = Column(String(32))
  26. son = relationship('Son')
  27.  
  28. Base.metadata.create_all(engine)
  29. Session = sessionmaker(bind=engine)
  30. session = Session()
  31.  
  32. f1 = Father(name = 'zhangyanlin',age = '')
  33.  
  34. w1 = Son(name = 'xiaozhang1',age = '')
  35. w2 = Son(name = 'xiaozhang2',age = '')
  36. # 重点是这里绑定关系
  37. f1.son = [w1,w2]
  38. # 只需要把父亲给传进去,儿子的自然就上传进去啦
  39. session.add(f1)
  40. 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. 关于IOS中UIWebView 加载HTML内容

    NSString *strContent=[info objectForKey:@"newContent"]; { NSArray *paths = NSSearchPathFor ...

  2. 使用phpize建立php扩展(Cannot find config.m4)(转)

    php源码:/root/soft/php-5.3.4php安装: /usr/local/php [root@ns root]# phpizeCannot find config.m4.Make sur ...

  3. Java常见异常总结

    算术异常类:ArithmeticExecption 空指针异常类:NullPointerException 类型强制转换异常:ClassCastException 数组负下标异常:NegativeAr ...

  4. PHP克隆魔术方法

    克隆对象 __clone() $p2=clone $p; $p=>say(); 克隆对象的时候自动调用的方法 作用和构造方法一样是对新克隆的对象进行初始化 在这个方法中$this是副本所以可以给 ...

  5. hdu 2027 统计元音

    统计元音 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submi ...

  6. C#的类型、变量和值

    大学学了C#,工作也是使用C#,虽然在日常的开发中没什么大的问题,但个人觉得在C#的理解还不是很清晰,所以决定花一定的时间来理一理学过的知识,顺便革新下脑袋里的知识,因为坑爹的学校在教.net的时候, ...

  7. java Spring 基于注解的配置(一)

    注解引用:1.service.xml 配置注解模式 <?xml version="1.0" encoding="UTF-8"?> <beans ...

  8. VIM学习1

    不得不说鸟哥的Linux写得太好了,VIM篇章,通读一篇,感觉收获挺大.之前几年前装逼硬着学,感觉硬是没懂,看的特晕,学得特别慢,抄一两遍也没什么多大的作用.这一回看了,感觉马上就能记住不少,当然大多 ...

  9. 自定义控件学习 Day44

    自定义控件学习 Day44 onMeasure 测量控件的宽高. onLayout 设置位置 onDarw 绘制控件 问题堆栈 1. 事件监听传递 最外层获取到控件,根据事件事件传递机制,返回值fal ...

  10. 那天有个小孩跟我说LINQ(六)转载

    2  LINQ TO SQL完结(代码下载)      我们还是接着上次那个简单的销售的业务数据库为例子,打开上次那个例子linq_Ch5 2.1 当数据库中的表建立了主外键 ①根据主键获取子表信息 ...