python下SQLAlchemy的使用
SQLAlchemy是python中orm常用的框架。支持各种主流的数据库,如SQLite、MySQL、Postgres、Oracle、MS-SQL、SQLServer 和 Firebird。
在安装好SQLAlchemy之后导入相关的模块,如下是一些常用的模块,也可以根据项目的实际需要在添加。
from sqlalchemy import Column, String, create_engine #导入包
from sqlalchemy.orm import sessionmaker
from sqlalchemy.ext.declarative import declarative_base
定义数据模型,通常创建SqlTable.py(文件名称自定义就好)
# coding: utf-8
from sqlalchemy import Column, Integer, String, Float, BigInteger, Unicode, Text
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import ForeignKey, Sequence
from sqlalchemy.orm import relationship
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker Base = declarative_base() class UserInfo(Base):#所有类继承自Base
__tablename__ = 'UserInfo'#表的名字
#表的字段定义
primaryId = Column(Integer,Sequence('user'),primary_key=True)
username = Column(Unicode(50))
password = Column(Unicode(50))
#以下为非必须方法,允许通过字典,对数据模型进行实例化
def __init__(self, user_dict):
for key in user_dict:
setattr(self, key, user_dict[key]) def update(self, info_dict):
for key in info_dict:
setattr(self, key, info_dict[key])
定义数据模型,数据模型中可以定义Id自增序列,在引用模块时添加Sequence,并且指定序列名称,如果多个数据模型共用一个序列,会导致非连续自增。
创建文件SqlManager.py,作用类似于C#中常见的SqlHellper,将SQLAlchemy的常用功能进行封装。
# coding: utf-8
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker
import SqlTable
from SqlTable import Base
import utils #自定义模块
from sqlalchemy import and_
from sqlalchemy import desc
from sqlalchemy import func config = utils.load_config() #自定义加载配置文件方法
engine = None
Session = None class GetSession(object):
def __init__(self):
self.session = Session() def __enter__(self):
return self.session def __exit__(self, exception_type, exception_value, exc_traceback):
if exception_type is not None:
self.session.rollback()
log.error("session error:{}".format(traceback.format_tb(exc_traceback)))
self.session.close() class SqlManager(objecet):
def __init__(self):
self._rlock = threading.RLock()
global Session
global engine
engine = create_engine( "mysql+pymysql://{user}:{pwd}@127.0.0.1:3306/{dbname}?charset=utf8".format(
user=config["db_user"], pwd=config["db_password"], dbname=config["dbname"]))
Base.metadata.create_all(engine)
Session = sessionmaker(bind=engine)
#以下为非必须举例,根据项目需求写增删改查,也可以通过泛型的思想编写一些
def add_user(self,username,pwd):
with self._rlock:
with GetSession() as session:
user= User( name=username,password=pwd)
session.add(user)
session.commit()
def add(self,tabname,dictlist):#注意:如果参数为字典列表,数据模型中要有相应的通过字典初始化的方法
with self._rlock:
table = getattr(SqlTable,tabname)
engine.execute(table.__table__.insert(),dictlist) def update(self,tabname,dict):
with self._rlock:
with GetSession as session:
table = getattr(SqlTable,tabname)
result=session.query(table),filter(table.id=dict["id"])
if len(result)==0:
new_info=table(dict)
session.add(new_info)
else:
update_info=result[0]
update_info.update(dict)#数据模型中需要有update方法
session.commit()
初始化数据连接 ,数据连接的基本格式为:数据库类型+数据库驱动名称://用户名:口令@机器地址:端口号/数据库名
如果提示引擎创建出错,可以尝试去掉数据库驱动名称,试运行等系统提示需要哪个模块,下载安装即可。
数据连接可以根据采用的数据库类型去拼接,有些数据库的驱动需要另外安装。创建方法如下:
engine = create_engine('mysql+pymysql://root:password@localhost:3306/test?charset=utf8')
engine = create_engine('sqlite:///' + unicode(config["db_path"], "utf-8")) #sqlite数据库可以直接指向地址,相对路径或绝对路径。
初始化数据库连接且数据模型创建完之后,需要在数据库中创建对应的表(有些类型的数据库需要手动创建),这一步可以交给SQLAlchemy来,代码如下:Base.metadata.create_all(engine) 。这行代码如果放在定义数据模型的最下边,会在import时运行,不建议放在sqltable.py中。上边代码放在了SqlManager类初始化的时候执行,避免import时加载的不受控制,具体原因会在正文后详述。
创建数据库会话类,这个类的实例可以当成数据库连接,同时还记录了一些的查询的数据并且决定什么时候才会执行数据操作。
Session = sessionmaker(bind=engine) #创建数据库会话类
数据库会话类的使用:
# 创建session对象:
session = Session()
# 创建新User对象:
new_user = User(id='5', name='Bob')
# 添加到session:
session.add(new_user)
# 提交即保存到数据库:
session.commit()
# 关闭session:
session.close()
或者使用with增加代码的健壮性:
new_user = User(id='5', name='Bob')
with GetSession() as session:
session.add(new_user)
session.commit()
基本操作到此可以应付日常工作,其他的进阶技能可以参考:http://blog.csdn.net/zd0303/article/details/50261347
关于with的使用:GetSession(),如上方法使用中的session是一个类对象,而且类中必须实现__enter__() 和__exit__()方法。
python下SQLAlchemy的使用的更多相关文章
- python下的orm基本操作(1)--Mysql下的CRUD简单操作(含源码DEMO)
最近逐渐打算将工作的环境转移到ubuntu下,突然发现对于我来说,这ubuntu对于我这种上上网,收收邮件,写写博客,写写程序的时实在是太合适了,除了刚接触的时候会不怎么完全适应命令行及各种权限管理, ...
- python之SQLAlchemy ORM 上
前言: SQLAlchmey是暑假学的,当时学完后也没及时写博客整理下.这篇博客主要介绍下SQLAlchemy及基本操作,写完后有空做个堡垒机小项目.下篇博客整理写篇关于Web框架和django基础~ ...
- 基于Python的SQLAlchemy的操作
安装 在Python使用SQLAlchemy的首要前提是安装相应的模块,当然作为python的优势,可以到python安装目录下的scripts下,同时按住shift+加上鼠标左键,从而在菜单中打开命 ...
- python之SQLAlchemy ORM
前言: 这篇博客主要介绍下SQLAlchemy及基本操作,写完后有空做个堡垒机小项目.有兴趣可看下python之数据库(mysql)操作.下篇博客整理写篇关于Web框架和django基础~~ 一.OR ...
- python使用sqlalchemy连接pymysql数据库
python使用sqlalchemy连接mysql数据库 字数833 阅读461 评论0 喜欢1 sqlalchemy是python当中比较出名的orm程序. 什么是orm? orm英文全称objec ...
- python 使用sqlalchemy进行数据库操作
sqlalchemy是python下一个著名的数据库orm库,可以方便地进行数据表创建.数据增删改查等操作 最详细的教程,见官方:https://docs.sqlalchemy.org 这里列举一些常 ...
- python下ssh的简单实现
python下的ssh都需要借助第三方模块paramiko来实现,在使用前需要手动安装. 一.python实现ssh (1) linux下的ssh登录 root@ubuntu:~# ssh morra ...
- python下编译py成pyc和pyo
python下编译py成pyc和pyo 其实很简单, 用 python -m py_compile file.py python -m py_compile /root/src/{file1,f ...
- Python下划线与命名规范
Python下划线与命名规范 先看结论,节省只想知道答案你的宝贵时间: _xxx 不能用于from module import * 以单下划线开头的表示的是protected类型的变量.即保护类型只能 ...
随机推荐
- New in 10.2.2: C++ and Debugger Improvements
In RAD Studio 10.2.2, we've made a number of great quality improvements for the C++ toolchain and fo ...
- 基于Web实现在线绘画拓扑图[GraphEditor]
网络拓扑图本来已经整理有一段时间了,一次项目会议写集中边界监控系统的时候上级要求使用可以在系统中画网络拓扑图,没办法当时找不到现有的程序来参考 只能硬着头皮,顶着风险来完成[当然来边界安全的,当然要安 ...
- JAVA如何设置代理server,s取消代理erver
1.一个简短的引论 代理server(Proxy Server)是一种重要的server安全功能,它的工作主要在开放系统互联(OSI)模型的会话层,从而起到防火墙的作用. 代理server大多被用来连 ...
- C++第11周(春)项目4 - 类族的设计
课程首页在:http://blog.csdn.net/sxhelijian/article/details/11890759,内有完整教学方案及资源链接 [项目4 - 类族的设计]按下面的提示,由基类 ...
- 得知OpenCV研究报告指出系列(一)VS2010+OpenCV2.4.9环境配置
学习OpenCV,首先,当然,要知道如何配置的环境. 余系统的软件和硬件环境,如以下: 以本人的配置环境为例,配置过程例如以下. 第一步 下载及解压OpenCV源代码 尽管非常多第三方站点及一些学习论 ...
- Arcgis for Javascript实现图
首先,截个图给大家看结果: 初始化状态 放大后的状态 点击选中后的状态 如上图所看到的,一般的涉及到的地图的统计涉及到上述所展示的三个状态:1.初始化状态.2.缩放后的状态:3.点击选中显示详情状态. ...
- 浅谈C/C++堆栈指引——C/C++堆栈很强大(绝美)
C/C++堆栈指引 Binhua Liu 前言 我们经常会讨论这样的问题:什么时候数据存储在飞鸽传书堆栈(Stack)中,什么时候数据存储在堆(Heap)中.我们知道,局部变量是存储在堆栈中的:deb ...
- SQList3 and SQL入门学习笔记
SQL 这是一个标准的计算机语言进行访问和操作数据库. 什么是 SQL? · SQL 指结构化查询语言 · SQL 使我们有能力訪问数据库 · SQL 是一种 AN ...
- spring boot 使用 pageHelper插件
按照github上的教程集成到spring boot pom文件引用需要改一下,教程的pom文件引用: 工程中要用以下方式 <!--分页--> <dependency> < ...
- Qt调用PolarSSL库(一个)
最近一直在学习SSL相关知识,也明白了理论相关知识,主要SSL基本概念和连接建立.主要依据PolarSSL开源库学习.学习完了之后就希望能给有所运用,就想用Qt写一个简单的程序,添加对SSL相关概念的 ...