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:[email protected]: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__()方法。

时间: 2024-11-17 15:10:14

python下SQLAlchemy的使用的相关文章

python之sqlalchemy

python之sqlalchemy ORM: ORM框架的作用就是把数据库表的一行记录与一个对象互相做自动转换. 正确使用ORM的前提是了解关系数据库的原理. ORM就是把数据库表的行与相应的对象建立关联,互相转换. 由于关系数据库的多个表还可以用外键实现一对多.多对多等关联,相应地, ORM框架也可以提供两个对象之间的一对多.多对多等功能. 一 单表操作(不涉及一对多,多对多) #coding:utf8 import sqlalchemy from sqlalchemy import crea

python之SQLAlchemy ORM 上

前言: SQLAlchmey是暑假学的,当时学完后也没及时写博客整理下.这篇博客主要介绍下SQLAlchemy及基本操作,写完后有空做个堡垒机小项目.下篇博客整理写篇关于Web框架和django基础~~ 一.ORM介绍 orm英文全称object relational mapping,就是对象映射关系程序,简单来说我们类似python这种面向对象的程序来说一切皆对象,但是我们使用的数据库却都是关系型的,为了保证一致的使用习惯,通过orm将编程语言的对象模型和数据库的关系模型建立映射关系,这样我们

python 下的crc16计算模块 XCRC16

又一次突然遇到用python处理modbus通信而需要crc16校验的问题,当时在百度上没找到,在google上找到了一个外国人开发的python包,结果安装好了之后发现校验的不正确(可能是使用的模式串不一样,xcrc16的模式串为0xa001),后来事情过去了就写了一个包弥补一下,xcrc16 的意思是 extend crc->xcrc ,也是我的第一个开源项目,如果大家使用程序遇到什么情况也麻烦通知我下,我会第一时间进行维护. 介绍: xcrc16 模块是为了解决crc16校验问题而写 目前

在python下学习libsvm

1.下载libsvm,python,gnuplot(链接网上全有,压缩包自己保留着) 2.在python上的实现(主要用截图的形式展现) (1)输入命令寻求最优参数 (2) 参数c,g输出结果 gnuplot输出图像 (3)最后输入训练数据,训练数据,通过建立模型进行预测 大概也就这样了,grid.py里面需要改下gnuplot的路径 在python下学习libsvm,布布扣,bubuko.com

python下通过os模块和shutil模块进行文件处理方式

python下通过os模块和shutil模块进行文件处理方式 得到当前工作目录路径:os.getcwd() 获取指定目录下的所有文件和目录名:os.listdir(dir) 删除文件:os.remove(file) 删除多个目录:os.removedirs(r"/home") 检测路径是否为文件:os.path.isfile(path) 检测路径是否为目录:os.path.isdir(path) 判断是否为绝对路径:os.path.isabs(path) 检测路径是否存在:os.pat

python下的MySQLdb使用

python下的MySQLdb使用 3.执行sql语句和接收返回值 cursor=conn.cursor() n=cursor.execute(sql,param) 首先,我们用使用连接对象获得一个cursor对象,接下来,我们会使用cursor提供的方法来进行工作.这些方法包括两大类:1.执行命令,2.接收返回值 cursor用来执行命令的方法: callproc(self, procname, args):用来执行存储过程,接收的参数为存储过程名和参数列表,返回值为受影响的行数 execut

sae Python下设置定时任务

官方文档在这里:http://sae.sina.com.cn/doc/python/cron.html 就是通过在config.yaml文件中添加Cron段,例如: cron: - description: timing_task url: /on_time schedule: "*/5 * * * *" 代表每5分钟以get方式访问/on_time这个链接. 还可以结合sae中的Taskqueue服务把大任务分成小任务,因为sae对于每次访问有时间限制,不能超过300秒. 提醒:冒号

Python下Json和Msgpack序列化比较

Python下Json和Msgpack序列化比较  最近用Python时,遇到了序列化对象的问题,传统的json和新型序列化工具包msgpack都有涉及,于是做一个简单的总结: 通俗的讲:序列化:将对象信息转化为可以存储或传输的形式:反序列化:把这个存储的内容还原成对象. json就不用多做解释了,是一种轻量级的数据交换格式,广泛应用于web开发中.当然也是将对象序列化成符合json规范的格式.网上有一堆堆资料. 官网:http://www.json.org msgpack就有意思了,先看下官方

python下的复杂网络编程包networkx的安装及使用

由于py3.x与工具包的兼容问题,这里采用py2.7 1.python下的复杂网络编程包networkx的使用: http://blog.sina.com.cn/s/blog_720448d301018px7.html 处理1里面提到的那四个安装包还要: 2.需要安装 setuptools: http://wenku.baidu.com/link?url=XL2qKVZbDPh-XocJW7OVZmacM4Tio5YhCyu0Uw-E7CjhiXRrhSWI4xheERjEVC3olCZ8muN