python连接数据库使用SQLAlchemy
参考python核心编程
ORM(Object Relational Mapper),如果你是一个更愿意操作Python对象而不是SQL查询的程序员,并且仍然希望使用关系型数据库作为你的后端,那么你可能更倾向于使用ORM。
ORM将纯SQL语句进行了抽象画处理,将其实现为python中的对象,这样你只操作这些对象就像完成于SQL语句相同的任务——数据库中的表被转化为Python类,其中的数据列作为属性,而数据库操作则会作为方法。一般来说,ORM为了代替你执行很多工作,会把一些事情变得复杂,或者比直接使用适配器更多的代码。但是,这点额外工作可以获得更高的生产效率。
目前,最知名的Python ORM是SQLAlchemy和SQLobject。而后者目前只支持python2的版本。
本节,我们探讨SQLAlchemy的使用。SQLALchemy帮助文档
SQLAlchemy不在python的标准库中需要我们手动安装,这里采用pip的安装方法:
- PS C:\Users\WC> pip install sqlalchemy
- Collecting sqlalchemy
- Downloading https://files.pythonhosted.org/packages/c1/c8/392fcd2d01534bc871c65cb964e0b39d59f
- /SQLAlchemy-1.2.7.tar.gz (5.6MB)
- 100% |████████████████████████████████| 5.6MB 299kB/s
- Installing collected packages: sqlalchemy
- Running setup.py install for sqlalchemy ... done
- Successfully installed sqlalchemy-1.2.7
下面的脚本简单实现了一个SQLAlchemy的连接到Mysql和sql server 的用户洗牌应用。运行该脚本时请注意我们使用到上一节编写的脚本!!!
- #本脚本兼容了python2.x和3.x版本,使用SQLAlchemy ORM连接sqlserver或者MySQL,实现一个用户洗牌的应用
- from os.path import dirname
- import pymysql
- from pymysql.err import InternalError
- from random import randrange
- from distutils.log import warn as printf
- from sqlalchemy import Column,Integer,String,create_engine,exc,orm
- from sqlalchemy.ext.declarative import declarative_base
- #导入本地应用模块(ushuffle_dbU)必要的常量和工具函数,这是为了避免到处复制、黏贴相同的代码
- from ushuffle_dbU import DBNAME,NAMELEN,randName,FIELDS,tformat,cformat,setup
- #dialect+driver://username:password@host:port/database
- DSNs = {
- 'mysql':'mysql+pymysql://root:Jwxjs123456@localhost/%s' % DBNAME,
- 'sqllite':'sqllite:///:memory:',
- 'sql server':'mssql+pymssql://sa:Jwxjs123456@localhost/%s' % DBNAME,
- }
- #SQLALchemy的声明层。
- base = declarative_base()
- class Users(base):#继承Base类
- __tablename__ = 'users' #映射的数据库表名
- login = Column(String(NAMELEN))
- userid = Column(Integer,primary_key = True)
- projid = Column(Integer)
- def __str__(self): #返回易于阅读的数据行的字符串格式
- return ''.join(map(tformat,(self.login,self.userid,self.projid)))
- class SQLALchemyTest(object):
- #初始化函数尽可能的得到一个可用的数据库,保存其连接
- def __init__(self,dsn):
- try:
- eng = create_engine(dsn)#,echo = True)#尝试使用dsn创建数据库引擎,echo设置为True可使得我们能看到ORM生成的SQL语句
- printf('*****创建数据库引擎成功')
- except ImportError:
- raise RuntimeError()#创建失败。一般来说,引擎创建失败意味着SQLAlchemy不支持所选的数据库,会抛出ImportError
- try :
- eng.connect()#如果数据库引擎创建成功,则尝试创建数据库连接
- printf('*****连接数据库%s成功' % DBNAME)
- except (exc.InternalError,InternalError):#如果创建连接失败,一般意味着数据库本身不可达。此例中是因为目标数据库不存在
- eng = create_engine( dirname(dsn),echo = True)#dirname返回dsn的目录。其实就是os.path.split(path)的第一个元素。效果相当于dsn去掉数据库
- eng.execute('create database %s' % DBNAME).close()
- printf('新建数据库%s成功' % DBNAME)
- eng.create_engine(dsn,echo = True)
- printf('连接数据库%s成功' % DBNAME)
- #创建数据库引擎连接之后,需要创建一个会话对象Session,其实是一个factory。
- #sessionmaker()也可以在create_engine之前创建,然后等到数据库引擎连接创建之后,调用Session.configure(bind=)实现绑定
- Session = orm.sessionmaker(bind=eng)
- #Session()可以创建一个绑定到数据库的对象。但是到此为止,它还没有打开任何的连接。
- #当它第一次被调用的时候,会尝试从数据库引擎连接池中检索一个链接,该连接会一直被持有直到所有的任务都被提交或者Session对象被关闭
- self.ses = Session()
- #将用户的表和数据库引擎作为 实例的属性保存下来。意味着这张表的所有操作都会被绑定到这个指定的引擎中。
- self.users = Users.__table__
- self.eng = self.users.metadata.bind = eng#引擎和表的元数据进行了额外的绑定,意味着这张表的所有操作都会绑定到这个指定的引擎中
- def insert(self):
- self.ses.add_all(Users(login= who,userid=userid,projid=randrange(1,5)) for who,userid in randName())
- self.ses.commit()
- def update(self):
- fr = randrange(1,5)
- to = randrange(1,5)
- i = -1
- users = self.ses.query(Users).filter_by(projid = fr).all()
- for i ,user in enumerate(users):
- user.projid = to
- self.ses.commit()
- printf('\n %s 个用户名从 %s 更改到 %s' % (i+1,fr,to))
- def delete(self):
- rm = randrange(1,5)
- i = -1
- users = self.ses.query(Users).filter_by(projid = rm).all()
- for i,user in enumerate(users):
- self.ses.delete(user)
- self.ses.commit()
- printf('组号为%s的共%s个用户被删除' % (rm,i+1))
- def finish(self):
- self.ses.connection().close()
- def dbDump(self):
- printf('\n%s' % ''.join(map(cformat,FIELDS)))
- users = self.ses.query(Users).all()
- for user in users:
- printf(user)
- self.ses.commit()
- def __getattr__(self,attr):#drop和create方法实际上只需要调用表的drop()和create()方法即可,不用我们自己单独编写。这里使用委托机制——当属性查找失败的时候会调用__getattr__()方法。
- return getattr(self.users,attr)#使用help(getattr)来获取帮助。getattr()获取对象的属性,getattr(x,'y')相当于执行x.y。
- def main():
- printf('连接%s数据库' % DBNAME)
- db = setup()
- if db not in DSNs:
- printf('\n ERROR:%s 数据库不被支持,程序退出')
- return
- try:
- orm = SQLALchemyTest(DSNs[db])
- except RuntimeError:
- printf('\nERROR: %s 数据库不支持,程序退出')
- printf('\n***创建users表()')
- orm.drop(checkfirst = True)#
- orm.create()
- printf('\n***创建users表,成功!!!')
- printf('%%%插入数据')
- orm.insert()
- orm.dbDump()
- printf('\n随机将用户进行分组')
- orm.update()
- orm.dbDump()
- printf('\n !!!随机删除用户')
- orm.delete()
- orm.dbDump()
- printf('\n***删除表格')
- orm.drop()
- printf('\n关闭数据库连接!')
- orm.finish()
- if __name__ == '__main__':
- main()
如果,你在运行过程中出现了警告(并不影响程序运行结果),可以做如下设置:
- import warnings
- warnings.filterwarnings("ignore")#忽略警告
python连接数据库使用SQLAlchemy的更多相关文章
- 20.Python笔记之SqlAlchemy使用
Date:2016-03-27 Title:20.Python笔记之SqlAlchemy使用 Tags:python Category:Python 作者:刘耀 博客:www.liuyao.me 一. ...
- python连接数据库问题小结
在使用python连接数据库的时候遇到了这个问题: 大概意思就是在django的setting.py中配置的用户名和密码报错. 主要就是修改setting.py的配置 其中在里边的name和user项 ...
- 3.Python连接数据库PyMySQL
1.安装PyMySQL,输入命令:pip3 install PyMySQL 2.使用Navicat,创建数据库:TESTDB,表:EMPLOYEE,字段:FIRST_NAME,LAST_NAME,AG ...
- python 连接oracle -- sqlalchemy及cx_Oracle的使用详解
python连接oracle -- sqlalchemy import cx_Oracle as orcl import pandas as pd from sqlalchemy import cre ...
- 数据测试001:利用python连接数据库插入excel数据
数据测试001:利用python连接数据库插入excel数据 最近在做数据测试,主要是做报表系统,需要往数据库插入数据验证服务逻辑,本次介绍如何利用python脚本插入Oracle和Mysql库中: ...
- 编写Python脚本把sqlAlchemy对象转换成dict的教程
编写Python脚本把sqlAlchemy对象转换成dict的教程 在用sqlAlchemy写web应用的时候,经常会用json进行通信,跟json最接近的对象就是dict,有时候操作dict也会比操 ...
- python连接数据库自动发邮件
python连接数据库实现自动发邮件 1.运行环境 redhat6 + python3.6 + crontab + Oracle客户端 2.用到的模块 3.操作步骤 (1)安装python3.6参考 ...
- Python连接数据库流行用到的第三方库
Python连接数据库流行用到的第三方库: mysqldb:只支持Python2.x mysqlclient : mysqldb的衍生版本,完全兼容mysqldb,同时支持Python3.x,安装较复 ...
- Python自动化之sqlalchemy
如果该数 据库支持 自增列 ,则 SQLAlchemy 默认 自动 设定 表中第一个 类型 为整形 的主键 为自增列 ORM介绍 orm英文全称object relational mapping,就是 ...
随机推荐
- Dart Learn Notes 04
流程控制语句 流程控制语句的作用就是控制代码的执行流程. if and else var a = 10; if(a > 10){ print('ok'); }else if( 5 < a ...
- 高德JS依赖分析工程及关键原理
一.背景 高德 App 进行 Bundle 化后,由于业务的复杂性,Bundle 的数量非常多.而这带来了一个新的问题——Bundle 之间的依赖关系错综复杂,需要进行管控,使 Bundle 之间的依 ...
- SpringBoot 整合 Zookeeper 接入Starring微服务平台
背景 最近接的一个项目是基于公司产品Starring做的微服务支付平台,纯后台项目,实现三方支付公司和银行接口来完成用户账户扣款,整合成通用支付接口发布给前端调用. 但是扯蛋了,这边前端什么都不想做, ...
- 在Spring Boot中添加全局异常捕捉提示
在一个项目中的异常我们我们都会统一进行处理的,那么如何进行统一进行处理呢? 全局异常捕捉: 新建一个类GlobalDefaultExceptionHandler, 在class注解上@Controll ...
- Authentication 接口验证访问 (C#)
private HttpClient _httpClient = new HttpClient(); private string PostToOwner(CarOwnerCoupon postDat ...
- 本地Docker Jenkins构建dotnet core web应用到Linux服务器 Docker上
1.准备工作 环境 本地: Windows.Docker 代码仓库:Git 服务器:Linux.Docker 前提准备 创建个有dockerfile文件的dotnet core 3 web项目 新建一 ...
- nginx代理跨域,根据路径参数改变目标服务器地址
我们都知道nginx是可以做跨域代理的: location ^~ /visited-path/ { proxy_pass http://another-domain/; } 举个例子:假如我们的代理服 ...
- docker的安装及常用命令
一:概述 Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器或Windows 机器上,也可以实现虚拟化,容器是完全使用 ...
- 利用python实现dll依赖关系导出
#说明:遍历rootdir目录下所有dll,导出每个dll依赖的dll信息到dstdir目录下 # 配合NotePad++打开所有txt,搜索,可快速定位到某dll被依赖的所有dll文件 import ...
- 侠梦说pinpoint--界面上的图标之AgetnInfo数据研究
前言 在启动一个挂载pinpoint的springboot项目的时候,界面上显示成了jboss的图标,所以今天研究了一下这个数据是怎么来的. 我们知道不同图标和服务类型有关,服务不同,图标就不同,这在 ...