Python之路51-sqlalchemy

ORM介绍

orm英文全称object relational mapping,就是对象映射关系程序,简单来说我们类似python这种面向对象的程序来说一切皆对象,但是我们使用的数据库却都是关系型的,为了保证一致的使用习惯,通过orm将编程语言的对象模型和数据库的关系模型建立映射关系,这样我们在使用编程语言对数据库进行操作的时候可以直接使用编程语言的对象模型进行操作就可以了,而不用直接使用sql语言。

orm的优点:

隐藏了数据访问细节,“封闭”的通用数据库交互,ORM的核心。他使得我们的通用数据库交互变得简单易行,并且完全不用考虑该死的SQL语句。快速开发,由此而来。

ORM使我们构造固化数据结构变得简单易行。

缺点:

无可避免的,自动化意味着映射和关联管理,代价是牺牲性能(早期,这是所有不喜欢ORM人的共同点)。现在的各种ORM框架都在尝试使用各种方法来减轻这块(LazyLoad,Cache),效果还是很显著的。

sqlalchemy安装

pip install SQLAlchemy

pip install pymysql

sqlalchemy基本使用

先创建一个表

CREATE TABLE user (
    id INTEGER NOT NULL AUTO_INCREMENT,
    name VARCHAR(32),
    password VARCHAR(64),
    PRIMARY KEY (id)
)

使用sqlalchemy实现同样的功能

创建user表

import sqlalchemy
from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column, Integer, String

engine = create_engine("mysql+pymysql://root:@127.0.0.1/learn_python",
                       encoding="utf-8",
                       echo=True)

Base = declarative_base()   # 生成orm基类

class User(Base):
    __tablename__ = "user"  # 表明
    id = Column(Integer, primary_key=True)
    name = Column(String(32))
    password = Column(String(64))

Base.metadata.create_all(engine)    # 创建表结构

user表已经创建好了,那我们开始用orm创建一条数据试试

import sqlalchemy
from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column, Integer, String
from sqlalchemy.orm import sessionmaker

# 创建user表
engine = create_engine("mysql+pymysql://root:@127.0.0.1/learn_python",
                       encoding="utf-8")

Base = declarative_base()   # 生成orm基类

class User(Base):
    __tablename__ = "user"  # 表名
    id = Column(Integer, primary_key=True)
    name = Column(String(32))
    password = Column(String(64))

Base.metadata.create_all(engine)    # 创建表结构

Session_class = sessionmaker(bind=engine)   # 创建与数据库的会话session class,注意,这里返回给session的是个class,不是实例
Session = Session_class()                   # 生成session实例

user_obj = User(name="Rain", password="1111111")     # 生成你要创建的数据对象
# print(user_obj.name, user_obj.password)             # 此时还没创建对象呢,不信你打印一下id发现还是None

Session.add(user_obj)                               # 把要创建的数据对象添加到这个session里,一会统一创建
# print(user_obj.name, user_obj.id)                   # 此时也依然还没创建

Session.commit()                                    # 现在才统一提交,创建数据

查询

import sqlalchemy
from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column, Integer, String
from sqlalchemy.orm import sessionmaker

engine = create_engine("mysql+pymysql://root:@127.0.0.1/learn_python",
                       encoding="utf-8")
                       
Base = declarative_base()

class User(Base):
    __tablename__ = "user"  # 表明
    id = Column(Integer, primary_key=True)
    name = Column(String(32))
    password = Column(String(64))

    def __repr__(self):
        return "<User(name=‘%s‘, password=‘%s‘)>" % (self.name, self.password)

data = Session.query(User).filter(User.name=="Tom").all()    # 查询user表中name为Tom的,所有信息
data = Session.query(User).filter_by(name="Tom").all()       # 查询user表中name为Tom的,所有信息
data = Session.query(User.name).filter(User.id > 3).all()    # 查询user表中id大于3的,name
data = Session.query(User).filter(User.id > 0).filter(User.id < 3).all()    # 多条件查询
data = Session.query(User).filter(User.id > 0).filter(User.name == "Tom").all()
print(data)

修改数据

import sqlalchemy
from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column, Integer, String
from sqlalchemy.orm import sessionmaker

# # 创建user表
engine = create_engine("mysql+pymysql://root:@127.0.0.1/learn_python",
                       encoding="utf-8")

Base = declarative_base()   # 生成orm基类

class User(Base):
    __tablename__ = "user"  # 表明
    id = Column(Integer, primary_key=True)
    name = Column(String(32))
    password = Column(String(64))

    def __repr__(self):
        return "<User(name=‘%s‘, password=‘%s‘)>" % (self.name, self.password)

Session_class = sessionmaker(bind=engine)   # 创建与数据库的会话session class,注意,这里返回给session的是个class,不是实例
Session = Session_class()                   # 生成session实例

data = Session.query(User).filter_by(name="Tom").first()
data.name = "Ben"
Session.commit()

删除数据

import sqlalchemy
from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column, Integer, String
from sqlalchemy.orm import sessionmaker

# 创建user表
engine = create_engine("mysql+pymysql://root:@127.0.0.1/learn_python",
                       encoding="utf-8")

Base = declarative_base()   # 生成orm基类

class User(Base):
    __tablename__ = "user"  # 表明
    id = Column(Integer, primary_key=True)
    name = Column(String(32))
    password = Column(String(64))

    def __repr__(self):
        return "<User(name=‘%s‘, password=‘%s‘)>" % (self.name, self.password)

Session_class = sessionmaker(bind=engine)   # 创建与数据库的会话session class,注意,这里返回给session的是个class,不是实例
Session = Session_class()                   # 生成session实例

data = Session.query(User).filter_by(name="Ben").first()
Session.delete(data)
Session.commit()

统计

import sqlalchemy
from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column, Integer, String
from sqlalchemy.orm import sessionmaker

# 创建user表
engine = create_engine("mysql+pymysql://root:@127.0.0.1/learn_python",
                       encoding="utf-8")

Base = declarative_base()   # 生成orm基类

class User(Base):
    __tablename__ = "user"  # 表明
    id = Column(Integer, primary_key=True)
    name = Column(String(32))
    password = Column(String(64))

    def __repr__(self):
        return "<User(name=‘%s‘, password=‘%s‘)>" % (self.name, self.password)

Session_class = sessionmaker(bind=engine)   # 创建与数据库的会话session class,注意,这里返回给session的是个class,不是实例
Session = Session_class()                   # 生成session实例

data = Session.query(User).filter(User.name.like("Ra%")).count()
print(data)

分组

import sqlalchemy
from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column, Integer, String
from sqlalchemy.orm import sessionmaker
from sqlalchemy import func

# 创建user表
engine = create_engine("mysql+pymysql://root:@127.0.0.1/learn_python",
                       encoding="utf-8")

Base = declarative_base()   # 生成orm基类

class User(Base):
    __tablename__ = "user"  # 表明
    id = Column(Integer, primary_key=True)
    name = Column(String(32))
    password = Column(String(64))

    def __repr__(self):
        return "<User(name=‘%s‘, password=‘%s‘)>" % (self.name, self.password)

Session_class = sessionmaker(bind=engine)   # 创建与数据库的会话session class,注意,这里返回给session的是个class,不是实例
Session = Session_class()                   # 生成session实例

data = Session.query(func.count(User.name), User.name).group_by(User.name).all()
print(data)
时间: 2024-08-13 22:42:43

Python之路51-sqlalchemy的相关文章

Python之路【第九篇】:Python操作 RabbitMQ、Redis、Memcache、SQLAlchemy

Python之路[第九篇]:Python操作 RabbitMQ.Redis.Memcache.SQLAlchemy Memcached Memcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载.它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高动态.数据库驱动网站的速度.Memcached基于一个存储键/值对的hashmap.其守护进程(daemon )是用C写的,但是客户端可以用任何语言来编写,并通过memcached协议与守护进程通信. Memc

Python之路:Python操作 RabbitMQ、Redis、Memcache、SQLAlchemy

Memcached Memcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载.它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高动态.数据库驱动网站的速度.Memcached基于一个存储键/值对的hashmap.其守护进程(daemon )是用C写的,但是客户端可以用任何语言来编写,并通过memcached协议与守护进程通信. Memcached安装和基本使用 Memcached安装: ? 1 2 3 4 5 6 7 8 wget http://me

python之路 RabbitMQ、SQLAlchemy

一.RabbitMQ RabbitMQ是一个在AMQP基础上完整的,可复用的企业消息系统.他遵循Mozilla Public License开源协议. MQ全称为Message Queue, 消息队列(MQ)是一种应用程序对应用程序的通信方法.应用程序通过读写出入队列的消息(针对应用程序的数据)来通信,而无需专用连接来链接它们.消 息传递指的是程序之间通过在消息中发送数据进行通信,而不是通过直接调用彼此来通信,直接调用通常是用于诸如远程过程调用的技术.排队指的是应用程序通过 队列来通信.队列的使

Python之路【第三篇】:Python基础(二)

Python之路[第三篇]:Python基础(二) 内置函数 一 详细见python文档,猛击这里 文件操作 操作文件时,一般需要经历如下步骤: 打开文件 操作文件 一.打开文件 1 文件句柄 = file('文件路径', '模式') 注:python中打开文件有两种方式,即:open(...) 和  file(...) ,本质上前者在内部会调用后者来进行文件操作,推荐使用 open. 打开文件时,需要指定文件路径和以何等方式打开文件,打开后,即可获取该文件句柄,日后通过此文件句柄对该文件操作.

Python之路【第十五篇】:Web框架

Python之路[第十五篇]:Web框架 Web框架本质 众所周知,对于所有的Web应用,本质上其实就是一个socket服务端,用户的浏览器其实就是一个socket客户端. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 #!/usr/bin/env python #coding:utf-8   import socket   def handle_request(client):     buf = client.recv(10

Python之路【第十七篇】:Django之【进阶篇】

Python之路[第十七篇]:Django[进阶篇 ] Model 到目前为止,当我们的程序涉及到数据库相关操作时,我们一般都会这么搞: 创建数据库,设计表结构和字段 使用 MySQLdb 来连接数据库,并编写数据访问层代码 业务逻辑层去调用数据访问层执行数据库操作 import MySQLdb def GetList(sql): db = MySQLdb.connect(user='root', db='wupeiqidb', passwd='1234', host='localhost')

Python之路【第十八篇】:Web框架们

Python之路[第十八篇]:Web框架们 Python的WEB框架 Bottle Bottle是一个快速.简洁.轻量级的基于WSIG的微型Web框架,此框架只由一个 .py 文件,除了Python的标准库外,其不依赖任何其他模块. 1 2 3 4 pip install bottle easy_install bottle apt-get install python-bottle wget http://bottlepy.org/bottle.py Bottle框架大致可以分为以下部分: 路

Python之路【第十七篇】:Django【进阶篇】

Python之路[第十七篇]:Django[进阶篇 ] Model 到目前为止,当我们的程序涉及到数据库相关操作时,我们一般都会这么搞: 创建数据库,设计表结构和字段 使用 MySQLdb 来连接数据库,并编写数据访问层代码 业务逻辑层去调用数据访问层执行数据库操作 import MySQLdb def GetList(sql): db = MySQLdb.connect(user='root', db='wupeiqidb', passwd='1234', host='localhost')

Python之路_Day12

Python之路_Day12_课堂笔记 上节回顾 一.线程 线程 基本线程使用 队列-消息队列 线程池 进程 基本使用 进程数据共享 进程池 协程 更适用IO操作 二.Memcache.Redis Memcache 集群: (C1,1) (C2,2) (C3,1) [C1,C2,C2,C3] gets/cas Redis 一. 默认支持连接池 支持事务 发布和订阅 二.Redis基本操作 三.自定义 Redis列表类型 默认全部取 根据索引取值 本节预告 一.线程池 二.redis,发布订阅 三

Python之路,day13-Python基础

一.redis redis是一个key-value存储系统.和Memcached类似,它支持存储的value类型相对更多,包括string(字符串).list(链表).set(集合).zset(sorted set --有序集合)和hash(哈希类型).这些数据类型都支持push/pop.add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的.在此基础上,redis支持各种不同方式的排序.与memcached一样,为了保证效率,数据都是缓存在内存中.区别的是redis会周