Python SQLAlchemy 简单的CRUD

Python SQLAlchemy 简单的CRUD
大家好,我是练习时长两年半的大数据练习生,喜欢数学,AI,大数据。
写博客是为了总结,分享,自娱自乐。希望写出的东西会对自己,对别人都有价值!
废话不多说,现在是个终身学习的时代,开始学习了!奥力给!干了兄弟们!
是时候展现真正的技术了:👇👇👇😋😋😋

文章目录

准备工作

上次写了SQLAlchemy用ORM描述表关系,今天就总结一下Alchemy的CRUD操作。
CRUD是指增加(Create)查询(Retrieve)更新(Update)删除(Delete)

今天了解到MySQLdb一般是py2.x版本使用的老东西了,现在人们都用pymysql了。
还有用Faker生成增删改查的假数据,Faker就是一个用来产生假数据的包。

首先把这俩包安装一下

www.zeeklog.com  - Python SQLAlchemy 简单的CRUD

会话Session

SQLAlchemy通过Session机制来操作MySQL数据库,所以你得先用engine创建一个Session对象。
因为engine知道数据库在哪,Session就得依靠engine的数据库地址信息来开启会话。

from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker

engine = create_engine('mysql+pymysql://root:root@localhost:3306/exam')
Session = sessionmaker(bind=engine)
session = Session()

要想理解下面的内容,你可能需要这些前置知识:

  • Python 列表生成式

增加(Create)

"""
Create 操作
"""

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

faker = Factory.create()

engine = create_engine('mysql+pymysql://root:root@localhost:3306/exam')
Session = sessionmaker(bind=engine)
session = Session()

Base = declarative_base()


class User(Base):
    __tablename__ = "User"
    id = Column(Integer, primary_key=True,autoincrement=True)
    cname = Column(String(64))
    caddress = Column(String(512))

    def __init__(self,name,address):
        self.cname = name
        self.caddress = address

    def __str__(self):
        return "cname:"+self.cname +" caddress:"+self.caddress

    def __repr__(self):
        return "cname:"+self.cname +" caddress:"+self.caddress


class Dog(Base):
    __tablename__ = "Dog"

    id = Column(Integer,primary_key=True,autoincrement=True)
    dname = Column(String(64))
    ddesc = Column(String(1024))

    def __init__(self,name,desc):
        self.dname = name
        self.ddesc = desc

    def __str__(self):
        return "dname:"+self.dname + " ddesc:"+self.ddesc


# 生成多条Users数据
Users = [User(name= faker.name(),address = faker.address()) for i in range(10)]

# 生成一条Dog数据
dog = Dog(name=faker.name(),desc=faker.email())

# 把描述的表创建出来
Base.metadata.create_all(engine)

# 把多个表数据添加到会话
session.add_all(Users)

# 把一个表数据添加到会话
session.add(dog)

# 提交会话
session.commit()

重点记忆:

  • 把多个表数据添加到会话session.add_all()
  • 把一个表数据添加到会话session.add()
  • 提交会话session.commit()

查询(Retrieve)

"""
Retrieve查询操作
"""

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

engine = create_engine('mysql+pymysql://root:root@localhost:3306/exam')

# 实例它一个sessionmaker类
Session = sessionmaker(bind=engine)

# 数据库会话
session = Session()

# 基类
Base = declarative_base()

# ORM描述User表
class User(Base):
    __tablename__ = "User"
    id = Column(Integer, primary_key=True,autoincrement=True)
    cname = Column(String(64))
    caddress = Column(String(512))

    def __init__(self,name,address):
        self.cname = name
        self.caddress = address

    def __str__(self):
        return "cname:"+self.cname +"\ncaddress:"+self.caddress

    def __repr__(self):
        return "cname:"+self.cname +"\ncaddress:"+self.caddress


# 查询会返回所有的结果
users = session.query(User).all()

# 遍历输出看所有结果
for user in users:
    print(user.__str__() +"\n--------------------------\n")

# 条件查询(我数据库里只有一个ElizabethBass),这里也是为了方便展示.first()获取第一个对象的作用
elizabeth = session.query(User).filter_by(cname='Elizabeth Bass').first()
print(elizabeth)
print("\n------------------------\n")
# 条件查询的另一种形式
elizabeth = session.query(User).filter(User.cname == 'Elizabeth Bass').first()
print(elizabeth)

更新(Update)

更新就是把它拿出来改一下再放回去。

"""
Update更新操作
"""

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

engine = create_engine('mysql+pymysql://root:root@localhost:3306/exam')

# 实例它一个sessionmaker类
Session = sessionmaker(bind=engine)

# 数据库会话
session = Session()

# 基类
Base = declarative_base()


# ORM描述Dog表
class Dog(Base):
    __tablename__ = "Dog"

    id = Column(Integer,primary_key=True,autoincrement=True)
    dname = Column(String(64))
    ddesc = Column(String(1024))

    def __init__(self,name,desc):
        self.dname = name
        self.ddesc = desc

    def __str__(self):
        return "dname:"+self.dname + " ddesc:"+self.ddesc

# 还记得吗,我们的数据库里只有一条Dog的数据
# 现在就把它拿出来,改一下名字,再放回去
dog = session.query(Dog).first()
print(dog)
print("\n---------------------\n")
# 给小狗改名
dog.dname = "little white"

# 提交更改
session.commit()

# 改完再看看
dog = session.query(Dog).first()
print(dog)

删除(Delete)

删除更简单,一个delete方法下去,再提交一下,就没了。

"""
删除Delete操作
"""

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

engine = create_engine('mysql+pymysql://root:root@localhost:3306/exam')

# 实例它一个sessionmaker类
Session = sessionmaker(bind=engine)

# 数据库会话
session = Session()

# 基类
Base = declarative_base()


# ORM描述Dog表
class Dog(Base):
    __tablename__ = "Dog"

    id = Column(Integer,primary_key=True,autoincrement=True)
    dname = Column(String(64))
    ddesc = Column(String(1024))

    def __init__(self,name,desc):
        self.dname = name
        self.ddesc = desc

    def __str__(self):
        return "dname:"+self.dname + " ddesc:"+self.ddesc

# 把唯一的一条狗数据删掉
dog = session.query(Dog).first()
session.delete(dog)
session.commit()

# 删了之后一条数据都没了 = =
dogs = session.query(Dog).all()
for dog in dogs:
    print(dog)
    print("\n------------------\n")

总结

经过几天的学习,终于了解到所谓的用SQLAlchemy改写SQL,就是用类把数据库描述出来,然后进行类的各种操作,从而代替原始SQL。

而且我也了解到原始SQL的重要性,只要原始SQL用的够6,不管是什么ORM,什么SQL框架,都离不开原始SQL。如果原始SQL掌握的不好,那就GG了。

最后,百度又学到了更规范的创建Engine的写法:

"""
创建Engine还有更规范的写法
"""
from sqlalchemy import create_engine

# 数据库ip
HOSTNAME = '127.0.0.1'
# 端口号
PORT = '3306'
# 数据库名称
DATABASE = 'exam'
# 用户名
USERNAME = 'root'
# 密码
PASSWORD = 'root'

DB_URI = 'mysql+pymysql://{}:{}@{}:{}/{}'.format(USERNAME, PASSWORD, HOSTNAME, PORT, DATABASE)

# 创建数据库引擎
engine = create_engine(DB_URI)
😆小伙伴们!相信看到这里的你一定有所收获!
😂如果我哪里写错欢迎评论区来喷😂😂😂
😘如果觉得对你有帮助请给个赞哦亲!🤞🤞🤞🤞🤞🤞
🤞🤞🤞最后引用名言一句:我们无论遇到什么困难,都不要怕,微笑着面对它!消除恐惧的最好办法就是面对恐惧!加油!奥力给!