博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Mysql存储之ORM框架SQLAlchemy
阅读量:6716 次
发布时间:2019-06-25

本文共 4747 字,大约阅读时间需要 15 分钟。

什么是ORM

ORM技术:Object-Relational Mapping,把关系数据库的表结构映射到对象上

也就是说不用再操作mysql的底层语句,而是通过操作映射后的对象。

安装与导入Sqlalchemy包

安装需要

pip install sqlalchemy

另外这里用了pymysql作为引擎,所以还要运行

pip install pymysql

导入需要的包

from sqlalchemy import (create_engine,MetaData)from sqlalchemy.orm import sessionmakerfrom sqlalchemy.ext.declarative import declarative_base

创建一个engine

链接形式:'数据库类型+数据库驱动名称://用户名:口令@机器地址:端口号/数据库名'

#basic.pyconnect_str= "mysql+pymysql://root:@localhost:3306/test?charset=ut8mb4"engine = create_engine(connect_str,echo=True)Base=declarative_base()#生成一个SqlORM 基类Session=sessionmaker(bind=eng,expire_on_commit=False)#bind绑定,创建与数据库的会话session classdb_session=Session()metadata=MetaData(engine )# 绑定元信息__all__ = ['eng', 'Base', 'db_session', 'metadata']#返回提供给后面程序用

create_engine()用来初始化数据库连接

echo=True对打印出原始的sql语句。默认Flase

当我们使用ORM的时候,其配置过程主要分为两个部分:一是描述我们要处理的数据库表的信息,二是将我们的Python类映射到这些表上。这两个过程在SQLAlchemy中是一起完成的,我们将这个过程称之为Declarative

使用Declarative参与ORM映射的类需要被定义成为一个指定基类的子类,这个基类应当含有ORM映射中相关的类和表的信息。这样的基类我们称之为declarative base class。在我们的应用中,我们一般只需要一个这样的基类。这个基类我们可以通过declarative_base来创建,

创建表结构

#tables.py#-*- coding=utf-8 -*-from sqlalchemy import (    Table, Column, INTEGER, String, Text,DateTime,BIGINT,CHAR,DECIMAL)from .basic import metadataimport datetimedl_item=Table("test",metadata,                Column("id",BIGINT,primary_key=True,autoincrement=True),                Column("name",String(30)),                Column("hobby",String(45)),                Column("date",DateTime),)

创建模型映射

#model.py# -*- coding=utf-8 -*-from dbs.basic import Basefrom dbs.tables import *class LoginInfo(Base):    __table__=test#填写表名

1.从Base派生一个名为LoginInfo的类,在这个类里面我们可以定义将要映射到数据库的表上的属性(主要是表的名字,列的类型和名称等).

2.类至少应该包含一个名为tablename的属性来给出目标表的名称,以及至少一个Column来给出表的主键(Primary Key)

查询操作

list = db_session.query(LoginInfo).filter_by(name="zs",hobby="music").filter(LoginInfo.id.in_([1,2,3,4,5])).order_by(LoginInfo.id).all()for item in list:   print(item.__dict__) #通过循环,然后获取对象的所有属性方法。

filter_by不支持使用mysql中的in 操作,所有使用filter,但是要注意的是使用filter查询的时候,需要对象.属性进行字段的操作。

下面是关于filter的更多方法:

等于
query.filter(LoginInfo.name == 'zs')#等于
不等于
query.filter(LoginInfo.name != 'zs')#不等于
LIKE
query.filter(LoginInfo.name.like('%an%'))#like语句
IN
query.filter(LoginInfo.name.in_(['zs', 'ls', 'ww']))#in语句或者类似的使用子查询query.filter(User.name.in_(        session.query(LoginInfo.name).filter(LoginInfo.name.like('%an%'))))
NOT IN
query.filter(~LoginInfo.name.in_(['zs', 'ls', 'ww']))#not in
IS NULL
query.filter(LoginInfo.name == None)#is null或query.filter(LoginInfo.name.is_(None))
IS NOT NULL
query.filter(LoginInfo.name != None)#IS NOT NULL:或者query.filter(LoginInfo.name.isnot(None))
AND
from sqlalchemy import and_query.filter(and_(LoginInfo.name == 'zs', LoginInfo.hobby == 'music'))或者query.filter(LoginInfo.name == 'zs', LoginInfo.hobby == 'music')或者连续使用filterquery.filter(LoginInfo.name == 'zs').filter(LoginInfo.hobby == 'music')
OR
from sqlalchemy import or_query.filter(or_(LoginInfo.name == 'zs', LoginInfo.name == 'ls'))
MATCH:
query.filter(LoginInfo.name.match('zhangsan'))

Session的query函数会返回一个Query对象,

all():返回一个对象列表循环之后直接获取对象属性即可。

first():返回至多一个结果,而且以单项形式,而不是只有一个元素的tuple形式返回这个结果.
one():返回且仅返回一个查询结果。当结果的数量不足一个或者多于一个时会报错。

嵌入使用SQL

你可以在Query中通过text()使用SQL语句。例如:

from sqlalchemy import textfor user in session.query(User).filter(text("id<224")).order_by(text("id")).all():    print(user.name)

除了上面这种直接将参数写进字符串的方式外,你还可以通过params()方法来传递参数

session.query(User).filter(text("id<:value and name=:name")).     params(value=224, name='fred').order_by(User.id).one()

输出

并且,你可以直接使用完整的SQL语句,但是要注意将表名和列明写正确。

session.query(User).from_statement(                     text("SELECT * FROM users where name=:name")).\                    params(name='ed').all()

输出

[
]

该部分内容来自网络。

计数

Query定义了一个很方便的计数函数count()

session.query(User).filter(User.name.like('%ed')).count()

等价于

SELECT count(*) AS count_1FROM (SELECT users.id AS users_id,                users.name AS users_name,                users.fullname AS users_fullname,                users.password AS users_passwordFROM usersWHERE users.name LIKE ?) AS anon_1('%ed',)

注意上面我们同时列出了实际的SQL指令。在SQLAlchemy中,我们总是将被计数的查询打包成一个子查询,然后对这个子查询进行计数。即便是最简单的SELECT count(*) FROM table,也会如此处理。为了更精细的控制计数过程,我们可以采用func.count()这个函数。

from sqlalchemy import funcsession.query(func.count(User.name), User.name).group_by(User.name).all()

等价于

session.query(func.count(User.name), User.name).group_by(User.name).all()SELECT count(users.name) AS count_1, users.name AS users_nameFROM users GROUP BY users.name

为了实现最简单的SELECT count(*) FROM table,我们可以如下调用

session.query(func.count('*')).select_from(User).scalar()

等价于

SELECT count(?) AS count_1FROM users('*',)

如果我们对User的主键进行计数,那么select_from也可以省略。

session.query(func.count(User.id)).scalar()

等价于

SELECT count(users.id) AS count_1FROM users

转载地址:http://zeelo.baihongyu.com/

你可能感兴趣的文章
Libreboot 项目向开源社区示好和致歉
查看>>
《CMYK 2.0——设计师色彩管理手册》—第1章1.3节副作用
查看>>
java.util.concurrent.locks.LockSupport
查看>>
红帽加入 Node.js 基金会白金会员
查看>>
《OpenGL编程指南》一2.7 独立的着色器对象
查看>>
Ionic 3.4.2 发布,漂亮的 HTML5 移动应用框架
查看>>
Linux Kernel 4.9-rc8,4.9 分支最后一个候选版
查看>>
想开发 Android 分支?没门!
查看>>
《Web异步与实时交互——iframe AJAX WebSocket开发实战》—— 2.2 相关关键技术及工作原理...
查看>>
《Nmap渗透测试指南》—第1章1.5节Mac OS安
查看>>
重磅,企业实施大数据的路径
查看>>
linux之cp/scp命令+scp命令详解
查看>>
Spark 源码分析 -- BlockStore
查看>>
《C语言编程初学者指南》一1.7 创建并运行第一个C程序
查看>>
学习和使用 PHP 应该注意的10件事
查看>>
《Ember.js实战》——2.5 Ember.js对象模型
查看>>
《响应式Web图形设计》一第13章 响应Web设计中的图像
查看>>
shiro session 监听
查看>>
定时任务框架Quartz的新玩法
查看>>
段前缀的使用(0504)
查看>>