参考python核心编程

ORM(Object Relational Mapper),如果你是一个更愿意操作Python对象而不是SQL查询的程序员,并且仍然希望使用关系型数据库作为你的后端,那么你可能更倾向于使用ORM。

ORM将纯SQL语句进行了抽象画处理,将其实现为python中的对象,这样你只操作这些对象就像完成于SQL语句相同的任务——数据库中的表被转化为Python类,其中的数据列作为属性,而数据库操作则会作为方法。一般来说,ORM为了代替你执行很多工作,会把一些事情变得复杂,或者比直接使用适配器更多的代码。但是,这点额外工作可以获得更高的生产效率。

目前,最知名的Python ORM是SQLAlchemy和SQLobject。而后者目前只支持python2的版本。

本节,我们探讨SQLAlchemy的使用。SQLALchemy帮助文档

SQLAlchemy不在python的标准库中需要我们手动安装,这里采用pip的安装方法:

  1. PS C:\Users\WC> pip install sqlalchemy
  2. Collecting sqlalchemy
  3. Downloading https://files.pythonhosted.org/packages/c1/c8/392fcd2d01534bc871c65cb964e0b39d59f
  4. /SQLAlchemy-1.2.7.tar.gz (5.6MB)
  5. 100% |████████████████████████████████| 5.6MB 299kB/s
  6. Installing collected packages: sqlalchemy
  7. Running setup.py install for sqlalchemy ... done
  8. Successfully installed sqlalchemy-1.2.7

下面的脚本简单实现了一个SQLAlchemy的连接到Mysql和sql server 的用户洗牌应用。运行该脚本时请注意我们使用到上一节编写的脚本!!!

  1. #本脚本兼容了python2.x和3.x版本,使用SQLAlchemy ORM连接sqlserver或者MySQL,实现一个用户洗牌的应用
  2.  
  3. from os.path import dirname
  4. import pymysql
  5. from pymysql.err import InternalError
  6. from random import randrange
  7. from distutils.log import warn as printf
  8. from sqlalchemy import Column,Integer,String,create_engine,exc,orm
  9. from sqlalchemy.ext.declarative import declarative_base
  10. #导入本地应用模块(ushuffle_dbU)必要的常量和工具函数,这是为了避免到处复制、黏贴相同的代码
  11. from ushuffle_dbU import DBNAME,NAMELEN,randName,FIELDS,tformat,cformat,setup
  12.  
  13. #dialect+driver://username:password@host:port/database
  14. DSNs = {
  15. 'mysql':'mysql+pymysql://root:Jwxjs123456@localhost/%s' % DBNAME,
  16. 'sqllite':'sqllite:///:memory:',
  17. 'sql server':'mssql+pymssql://sa:Jwxjs123456@localhost/%s' % DBNAME,
  18. }
  19.  
  20. #SQLALchemy的声明层。
  21. base = declarative_base()
  22. class Users(base):#继承Base
  23. __tablename__ = 'users' #映射的数据库表名
  24. login = Column(String(NAMELEN))
  25. userid = Column(Integer,primary_key = True)
  26. projid = Column(Integer)
  27. def __str__(self): #返回易于阅读的数据行的字符串格式
  28. return ''.join(map(tformat,(self.login,self.userid,self.projid)))
  29.  
  30. class SQLALchemyTest(object):
  31. #初始化函数尽可能的得到一个可用的数据库,保存其连接
  32. def __init__(self,dsn):
  33. try:
  34. eng = create_engine(dsn)#,echo = True)#尝试使用dsn创建数据库引擎,echo设置为True可使得我们能看到ORM生成的SQL语句
  35. printf('*****创建数据库引擎成功')
  36. except ImportError:
  37. raise RuntimeError()#创建失败。一般来说,引擎创建失败意味着SQLAlchemy不支持所选的数据库,会抛出ImportError
  38. try :
  39. eng.connect()#如果数据库引擎创建成功,则尝试创建数据库连接
  40. printf('*****连接数据库%s成功' % DBNAME)
  41. except (exc.InternalError,InternalError):#如果创建连接失败,一般意味着数据库本身不可达。此例中是因为目标数据库不存在
  42. eng = create_engine( dirname(dsn),echo = True)#dirname返回dsn的目录。其实就是os.path.split(path)的第一个元素。效果相当于dsn去掉数据库
  43. eng.execute('create database %s' % DBNAME).close()
  44. printf('新建数据库%s成功' % DBNAME)
  45. eng.create_engine(dsn,echo = True)
  46. printf('连接数据库%s成功' % DBNAME)
  47. #创建数据库引擎连接之后,需要创建一个会话对象Session,其实是一个factory。
  48. #sessionmaker()也可以在create_engine之前创建,然后等到数据库引擎连接创建之后,调用Session.configure(bind=)实现绑定
  49. Session = orm.sessionmaker(bind=eng)
  50. #Session()可以创建一个绑定到数据库的对象。但是到此为止,它还没有打开任何的连接。
  51. #当它第一次被调用的时候,会尝试从数据库引擎连接池中检索一个链接,该连接会一直被持有直到所有的任务都被提交或者Session对象被关闭
  52. self.ses = Session()
  53. #将用户的表和数据库引擎作为 实例的属性保存下来。意味着这张表的所有操作都会被绑定到这个指定的引擎中。
  54. self.users = Users.__table__
  55. self.eng = self.users.metadata.bind = eng#引擎和表的元数据进行了额外的绑定,意味着这张表的所有操作都会绑定到这个指定的引擎中
  56. def insert(self):
  57. self.ses.add_all(Users(login= who,userid=userid,projid=randrange(1,5)) for who,userid in randName())
  58. self.ses.commit()
  59.  
  60. def update(self):
  61. fr = randrange(1,5)
  62. to = randrange(1,5)
  63. i = -1
  64. users = self.ses.query(Users).filter_by(projid = fr).all()
  65. for i ,user in enumerate(users):
  66. user.projid = to
  67. self.ses.commit()
  68. printf('\n %s 个用户名从 %s 更改到 %s' % (i+1,fr,to))
  69.  
  70. def delete(self):
  71. rm = randrange(1,5)
  72. i = -1
  73. users = self.ses.query(Users).filter_by(projid = rm).all()
  74. for i,user in enumerate(users):
  75. self.ses.delete(user)
  76. self.ses.commit()
  77. printf('组号为%s的共%s个用户被删除' % (rm,i+1))
  78.  
  79. def finish(self):
  80. self.ses.connection().close()
  81.  
  82. def dbDump(self):
  83. printf('\n%s' % ''.join(map(cformat,FIELDS)))
  84. users = self.ses.query(Users).all()
  85. for user in users:
  86. printf(user)
  87. self.ses.commit()
  88.  
  89. def __getattr__(self,attr):#dropcreate方法实际上只需要调用表的drop()和create()方法即可,不用我们自己单独编写。这里使用委托机制——当属性查找失败的时候会调用__getattr__()方法。
  90. return getattr(self.users,attr)#使用help(getattr)来获取帮助。getattr()获取对象的属性,getattr(x,'y')相当于执行x.y
  91.  
  92. def main():
  93. printf('连接%s数据库' % DBNAME)
  94. db = setup()
  95.  
  96. if db not in DSNs:
  97. printf('\n ERROR:%s 数据库不被支持,程序退出')
  98. return
  99.  
  100. try:
  101. orm = SQLALchemyTest(DSNs[db])
  102. except RuntimeError:
  103. printf('\nERROR: %s 数据库不支持,程序退出')
  104.  
  105. printf('\n***创建users表()')
  106. orm.drop(checkfirst = True)#
  107. orm.create()
  108. printf('\n***创建users表,成功!!!')
  109.  
  110. printf('%%%插入数据')
  111. orm.insert()
  112. orm.dbDump()
  113.  
  114. printf('\n随机将用户进行分组')
  115. orm.update()
  116. orm.dbDump()
  117.  
  118. printf('\n !!!随机删除用户')
  119. orm.delete()
  120. orm.dbDump()
  121.  
  122. printf('\n***删除表格')
  123. orm.drop()
  124.  
  125. printf('\n关闭数据库连接!')
  126. orm.finish()
  127.  
  128. if __name__ == '__main__':
  129. main()

如果,你在运行过程中出现了警告(并不影响程序运行结果),可以做如下设置:

  1. import warnings
  2. warnings.filterwarnings("ignore")#忽略警告

python连接数据库使用SQLAlchemy的更多相关文章

  1. 20.Python笔记之SqlAlchemy使用

    Date:2016-03-27 Title:20.Python笔记之SqlAlchemy使用 Tags:python Category:Python 作者:刘耀 博客:www.liuyao.me 一. ...

  2. python连接数据库问题小结

    在使用python连接数据库的时候遇到了这个问题: 大概意思就是在django的setting.py中配置的用户名和密码报错. 主要就是修改setting.py的配置 其中在里边的name和user项 ...

  3. 3.Python连接数据库PyMySQL

    1.安装PyMySQL,输入命令:pip3 install PyMySQL 2.使用Navicat,创建数据库:TESTDB,表:EMPLOYEE,字段:FIRST_NAME,LAST_NAME,AG ...

  4. python 连接oracle -- sqlalchemy及cx_Oracle的使用详解

    python连接oracle -- sqlalchemy import cx_Oracle as orcl import pandas as pd from sqlalchemy import cre ...

  5. 数据测试001:利用python连接数据库插入excel数据

    数据测试001:利用python连接数据库插入excel数据 最近在做数据测试,主要是做报表系统,需要往数据库插入数据验证服务逻辑,本次介绍如何利用python脚本插入Oracle和Mysql库中: ...

  6. 编写Python脚本把sqlAlchemy对象转换成dict的教程

    编写Python脚本把sqlAlchemy对象转换成dict的教程 在用sqlAlchemy写web应用的时候,经常会用json进行通信,跟json最接近的对象就是dict,有时候操作dict也会比操 ...

  7. python连接数据库自动发邮件

    python连接数据库实现自动发邮件 1.运行环境 redhat6 + python3.6 + crontab + Oracle客户端 2.用到的模块  3.操作步骤 (1)安装python3.6参考 ...

  8. Python连接数据库流行用到的第三方库

    Python连接数据库流行用到的第三方库: mysqldb:只支持Python2.x mysqlclient : mysqldb的衍生版本,完全兼容mysqldb,同时支持Python3.x,安装较复 ...

  9. Python自动化之sqlalchemy

    如果该数 据库支持 自增列 ,则 SQLAlchemy 默认 自动 设定 表中第一个 类型 为整形 的主键 为自增列 ORM介绍 orm英文全称object relational mapping,就是 ...

随机推荐

  1. Dart Learn Notes 04

    流程控制语句 流程控制语句的作用就是控制代码的执行流程. if and else var a = 10; if(a > 10){ print('ok'); }else if( 5 < a ...

  2. 高德JS依赖分析工程及关键原理

    一.背景 高德 App 进行 Bundle 化后,由于业务的复杂性,Bundle 的数量非常多.而这带来了一个新的问题——Bundle 之间的依赖关系错综复杂,需要进行管控,使 Bundle 之间的依 ...

  3. SpringBoot 整合 Zookeeper 接入Starring微服务平台

    背景 最近接的一个项目是基于公司产品Starring做的微服务支付平台,纯后台项目,实现三方支付公司和银行接口来完成用户账户扣款,整合成通用支付接口发布给前端调用. 但是扯蛋了,这边前端什么都不想做, ...

  4. 在Spring Boot中添加全局异常捕捉提示

    在一个项目中的异常我们我们都会统一进行处理的,那么如何进行统一进行处理呢? 全局异常捕捉: 新建一个类GlobalDefaultExceptionHandler, 在class注解上@Controll ...

  5. Authentication 接口验证访问 (C#)

    private HttpClient _httpClient = new HttpClient(); private string PostToOwner(CarOwnerCoupon postDat ...

  6. 本地Docker Jenkins构建dotnet core web应用到Linux服务器 Docker上

    1.准备工作 环境 本地: Windows.Docker 代码仓库:Git 服务器:Linux.Docker 前提准备 创建个有dockerfile文件的dotnet core 3 web项目 新建一 ...

  7. nginx代理跨域,根据路径参数改变目标服务器地址

    我们都知道nginx是可以做跨域代理的: location ^~ /visited-path/ { proxy_pass http://another-domain/; } 举个例子:假如我们的代理服 ...

  8. docker的安装及常用命令

    一:概述 Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器或Windows 机器上,也可以实现虚拟化,容器是完全使用 ...

  9. 利用python实现dll依赖关系导出

    #说明:遍历rootdir目录下所有dll,导出每个dll依赖的dll信息到dstdir目录下 # 配合NotePad++打开所有txt,搜索,可快速定位到某dll被依赖的所有dll文件 import ...

  10. 侠梦说pinpoint--界面上的图标之AgetnInfo数据研究

    前言 在启动一个挂载pinpoint的springboot项目的时候,界面上显示成了jboss的图标,所以今天研究了一下这个数据是怎么来的. 我们知道不同图标和服务类型有关,服务不同,图标就不同,这在 ...