当前位置: 首页 > news >正文

SQLAlchemy -- Python的ORM驱动

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

Python 领域最著名的 ORM 框架,构建于第三方 DBAPI 之上

安装

pip install SQLAlchemy MySQL-python

使用

定义模型

from sqlalchemy import Column, SmallInteger, Integer, BigInteger, Float, CHAR, String, Date, DateTime
from sqlalchemy.ext.declarative import declarative_base

Base = declarative_base() #模型基类

class Test(Base):
    __tablename__ = 'test'

    id   = Column(Integer(unsigned=True), primary_key=True)
    name = Column(Char(32))
    desc = Column(String, nullable=True, index=True)

ORM调用

from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker

# 数据库连接
engine = create_engine('mysql+mysqldb://username:password@host:port/dbname')
# 会话类
Session = sessionmaker(bind=engine)
# 会话实例
session = Session()

# 插入记录
test_item = Test(id=1, name='aaa')
session.add(test_item)
session.commit()

# 查询
query = session.query(Test).filter(Test.id==1, ...).offset(10).limit(5).order_by('id asc')
print query.statement #sql语句
query.all|one|first() #对于first查询结果空返回None
query.get(id) #主键查询
print test_item.name
session.commit()

# 更新
query.update({Test.desc: 'xxx'}) # 批量更新
session.merge(new_test_item)) #主键搜索记录并更新
session.commit()

# 删除
session.delete(test_item)
session.commit()

# 原生SQL
session.execute('select * from test where id = :id', {'id':1}).first()

# 关闭会话
session.close()

简单自定义封装

定义db.py模块

# -*- coding: utf-8 -*-

""" ORM公共层 """

import os
import types
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker
from sqlalchemy.ext.declarative import declarative_base


""" 数据库连接 """
_con_params = (
    'mysql',
    'mysqldb',
    os.environ.get('MYSQL_USERNAME'),
    os.environ.get('MYSQL_PASSWORD'),
    os.environ.get('MYSQL_HOST'),
    os.environ.get('MYSQL_PORT'),
    os.environ.get('MYSQL_DATABASE'),
)
_engine = create_engine('%s+%s://%s:%s@%s:%s/%s' % _con_params)
_session_factory = sessionmaker(bind=_engine)
session = _session_factory()


""" 模型基类 """
class ModelMixin:
    @classmethod
    def query(cls):
        return session.query(cls)

    @classmethod
    def create(cls, data):
        if type(data) ==  types.DictType:
            record = cls(**data)
        else:
            record = data
        session.add(record)
        session.commit()
        return reload

    @classmethod
    def find(cls, id):
        return cls.query().get(id)

    def save(self):
        session.merge(self)
        session.commit()

BaseModel = declarative_base()

参考

  • 列定义:https://docs.sqlalchemy.org/en/rel_1_1/core/metadata.html#sqlalchemy.schema.Column
  • 列类型:https://docs.sqlalchemy.org/en/rel_1_1/core/type_basics.html
  • Session API:http://docs.sqlalchemy.org/en/rel_1_1/orm/session_api.html#sqlalchemy.orm.session.Session.add
  • Query API:http://docs.sqlalchemy.org/en/rel_1_1/orm/query.html#sqlalchemy.orm.query.Query

转载于:https://my.oschina.net/u/2400083/blog/899061

相关文章:

  • console.log()注意事项。
  • NM常用网络命令
  • 点击手机号,跳转到手机打电话
  • BUS Matrix
  • 记前端小白入门15天
  • 大约 C++ 几个方面分析--overload, override, overwrite, rewrite
  • 字典类型的字符串转成字典
  • Aspose.Words 最新版发布【附下载】
  • go log包
  • C# 并行计算(Parallel 和 ParallelQuery)
  • Web客户端安全性最佳实践
  • 关于数据分析的4点心得:维度、指标、KPI
  • python抓包
  • 正则表达式的理解
  • ASP入门(十七)-ASP #include
  • IE9 : DOM Exception: INVALID_CHARACTER_ERR (5)
  • 分享一款快速APP功能测试工具
  • 「前端」从UglifyJSPlugin强制开启css压缩探究webpack插件运行机制
  • 【JavaScript】通过闭包创建具有私有属性的实例对象
  • 2019.2.20 c++ 知识梳理
  • iOS动画编程-View动画[ 1 ] 基础View动画
  • NSTimer学习笔记
  • Spring Security中异常上抛机制及对于转型处理的一些感悟
  • tab.js分享及浏览器兼容性问题汇总
  • TypeScript实现数据结构(一)栈,队列,链表
  • 创建一种深思熟虑的文化
  • 从地狱到天堂,Node 回调向 async/await 转变
  • 缓存与缓冲
  • 开年巨制!千人千面回放技术让你“看到”Flutter用户侧问题
  • 买一台 iPhone X,还是创建一家未来的独角兽?
  • 微信小程序设置上一页数据
  • 测评:对于写作的人来说,Markdown是你最好的朋友 ...
  • ​LeetCode解法汇总307. 区域和检索 - 数组可修改
  • ​如何使用ArcGIS Pro制作渐变河流效果
  • #Linux(帮助手册)
  • #QT(TCP网络编程-服务端)
  • #宝哥教你#查看jquery绑定的事件函数
  • (06)金属布线——为半导体注入生命的连接
  • (12)目标检测_SSD基于pytorch搭建代码
  • (2)nginx 安装、启停
  • (Matlab)遗传算法优化的BP神经网络实现回归预测
  • (超简单)构建高可用网络应用:使用Nginx进行负载均衡与健康检查
  • (动态规划)5. 最长回文子串 java解决
  • (二)七种元启发算法(DBO、LO、SWO、COA、LSO、KOA、GRO)求解无人机路径规划MATLAB
  • (二)什么是Vite——Vite 和 Webpack 区别(冷启动)
  • (利用IDEA+Maven)定制属于自己的jar包
  • (三)Hyperledger Fabric 1.1安装部署-chaincode测试
  • (转)Spring4.2.5+Hibernate4.3.11+Struts1.3.8集成方案一
  • (转)大道至简,职场上做人做事做管理
  • .Net 6.0 处理跨域的方式
  • .net core 6 redis操作类
  • .NET Micro Framework 4.2 beta 源码探析
  • .NET 解决重复提交问题
  • .NET 中创建支持集合初始化器的类型
  • .net和jar包windows服务部署