Python-SQLAlchemy的使用

MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,目前属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS (Relational Database Management System,关系数据库管理系统) 应用软件。
MySQL是一种关系数据库管理系统,关系数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。
MySQL所使用的 SQL 语言是用于访问数据库的最常用标准化语言。MySQL 软件采用了双授权政策,分为社区版和商业版,由于其体积小、速度快、总体拥有成本低,尤其是开放源码这一特点,一般中小型网站的开发都选择 MySQL 作为网站数据库。之前我们学习了如何使用PyMySQL,接下来记录下在Python中使用SQLAlchemy与PyMySQL结合实现与MySQL相连接:

下载SQLAlchemy

pip install sqlalchemy

创建表

import sqlalchemy
import sqlalchemy.ext.declarative
import sqlalchemy.orm

# 初始化数据库连接:root用户名,123456为密码,localhost本机地址,pythondb数据库名称,charset=utf8用于支持插入中文
engine = sqlalchemy.create_engine("mysql+pymysql://root:123456@localhost/pythondb?charset=utf8")

# 创建orm基类
Base = sqlalchemy.ext.declarative.declarative_base()

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

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

外键关联

  • ForeignKey与relationship
import sqlalchemy
import sqlalchemy.orm
import sqlalchemy.ext.declarative

engine = sqlalchemy.create_engine("mysql+pymysql://root:123456@localhost/pythondb?charset=utf8")

Base = sqlalchemy.ext.declarative.declarative_base()

class Student(Base):
    __tablename__ = "student"
    id = sqlalchemy.Column(sqlalchemy.Integer,primary_key=True)
    name = sqlalchemy.Column(sqlalchemy.String(32))

class Record(Base):
    __tablename__ = "record"
    id = sqlalchemy.Column(sqlalchemy.Integer,primary_key=True)
    record = sqlalchemy.Column(sqlalchemy.Integer)
    # 添加外键
    name_id = sqlalchemy.Column(sqlalchemy.Integer,sqlalchemy.ForeignKey("student.id"))
    # 建立关系
    student = sqlalchemy.orm.relationship("Student",backref="student_record")

Base.metadata.create_all(engine)

Session = sqlalchemy.orm.sessionmaker(bind=engine)
session = Session()

#===================插入数据===================
s1 = Student(name = "laowang")
s2 = Student(name = "laozhang")
s3 = Student(name = "xiaoma")

r1 = Study_Record(record = 90,name_id = 1)
r2 = Study_Record(record = 90,name_id = 2)
r3 = Study_Record(record = 85,name_id = 3)

session.add_all([s1,s2,s3,r1,r2,r3])

data = session.query(Student).filter(Student.name == "laowang").first()
print(data.student_record)      # 获取laowang的record信息,若没有relationship,将无法获取到
session.commit()
  • 多对多关系
import sqlalchemy
import sqlalchemy.orm
import sqlalchemy.ext.declarative

engine = sqlalchemy.create_engine("mysql+pymysql://root:123456@localhost/pythondb?charset=utf8")
Base = sqlalchemy.ext.declarative.declarative_base()

m_t_m = sqlalchemy.Table("m_t_m_table",Base.metadata,
            sqlalchemy.Column("books_id",sqlalchemy.Integer,sqlalchemy.ForeignKey("books.id")),
            sqlalchemy.Column("authors_id",sqlalchemy.Integer,sqlalchemy.ForeignKey("authors.id"))
            )

class Books(Base):
    __tablename__ = "books"
    id = sqlalchemy.Column(sqlalchemy.Integer,primary_key=True)
    name = sqlalchemy.Column(sqlalchemy.String(32))
    authors = sqlalchemy.orm.relationship("Authors",secondary=m_t_m,backref="books")

class Authors(Base):
    __tablename__ = "authors"
    id = sqlalchemy.Column(sqlalchemy.Integer,primary_key=True)
    name = sqlalchemy.Column(sqlalchemy.String(64))

Base.metadata.create_all(engine)

Session = sqlalchemy.orm.sessionmaker(bind=engine)
session = Session()

# 插入数据
b1 = Books(name="Python核心编程")
b2 = Books(name="Python基础编程")
b3 = Books(name="Python网络编程")

a1 = Authors(name="老王")
a2 = Authors(name = "老张")

b1.authors = [a1]
b2.authors = [a2]
b3.authors = [a1,a2]

session.add_all([b1,b2,b3,a1,a2])

# 查询数据,
book = session.query(Books).filter(Books.name == "Python核心编程").first()
print(books.authors)    # 打印Python核心编程的所有作者,返回的是一个列表

author = session.query(Authors).filter(Authors.name == "老王").first()
print(author.books)     # 打印老王的所有书,这里books对应的是backref里的值

session.commit()

插入数据

# 生成Session类
Session = sqlalchemy.orm.sessionmaker(bind=engine)
# 创建session对象
session = Session()

user = User(name="laowang",password="123456")       # 指定参数,不能用位置参数

session.add(user)

# 统一提交
session.commit()

查询

  • 查询所有
# 查询所有
data = session.query(User).all()    # 返回User对象列表;
# 获取所有User与名称
data = session.query(User,User.name).all()      # 返回(User对象,name)的元组列表
# 获取所有名称
data = session.query(User.name).all()       # 返回(name)的元组列表
  • 查询多条与单条数据
# 查询多条,返回一个列表
data = session.query(User).filter_by(name ="laowang").all()
# 查询一条 
data = session.query(User).filter_by(name ="laowang").first()
  • filter
# 单个条件
data = session.query(User).filter(User.name == "laowang").first()

# 模糊查询
data = session.query(User).filter(User.name.like("l%")).all()

# 分组查询(select name from user group by name;)
data = session.query(User.name).group_by(User.name).all()

# 或关系(select * from user where name = "laowang" or name = "xiaoma";)
data = session.query(User).filter(User.name.in_(["laowang","xiaoma"])).all()
也可以这样写:
data = session.query(User).filter(sqlalchemy.or_(User.name == "laowang",User.name == "xiaoma")).all()



# 查询多个条件
data = session.query(User).filter(User.name == "laowang").filter(User.password == "123456").all()
也可以这样写:
data = session.query(User).filter(User.name == "laowang",User.password == "123456").all()
又或者这样写:
data = session.query(User).filter(sqlalchemy.and_(User.name == "laowang",User.password == "123456")).all()


# 关联查询(select * from User,Student where User.id = Student.id)
data = session.query(User,Student).filter(User.id == Student.id).all()
  • filter_by
# 单个条件
data = session.query(User).filter_by(name = "laowang").first()
# 多个条件
data = session.query(User).filter_by(name = "laowang").filter_by(password = "123456").first()
也可以这样写:
data = session.query(User).filter_by(name = "laowang",password = "123456").first()

注:filter_by与filter的区别,filter主要适用于>,<,==,!= 这种比较关系,并且用用户类调用位置参数,而filter_by则只需用参数名即可,而且filter_by似乎只是用与=

修改

student = session.query(Student).filter(Student.id == 1).first()
student.name = "laoli"

session.commit()

删除

s = session.query(Student).filter(Student.name == "laowang").first()
session.delete(s)

session.commit()
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值