sqlAlchemy

1,SQLAlchemy是Python知名的ORM工具之一,为高效和高性能的数据库访问设计,实现了完整的企业级持久模型.SQLAlchemy的理念是SQL数据库的量级和性能重要于集合对象,而对象集合的抽象有重要于表和行.因此SQLAlchemy采用了类似于Hibernate的数据映射模型,而不是其他ORM框架采用的Active Record不过,Elixir和declarative等可选插件可以让用户使用声明语法。

2,安装SQLAlchemy.

pip install sqlalchemy

  • 如果安装SQLAlchemy报错,那是因为SQLAlchemy依赖pymysql

3,创建表,并连接数据库

复制代码
# ORM
# 1,Class - Obj
# 创建数据库引擎
# 将所有的Class序列化成数据表
# ORM操作 - CRUD (增删改查)


# 1,创建一个class(表)
from sqlalchemy.ext.declarative import declarative_base

# 实例化一个declaraive_base对象
Base = declarative_base()
# Base 是ORM模型 基类
# ORM模型 - Obj里面的属性 == table中创建的字段
#   - Obj定义table的操作方式和属性

from sqlalchemy import Column, Integer, String


class User(Base):
    __tablename__ = "user"
    id = Column(Integer, primary_key=True, autoincrement=True)
    name = Column(String(32), index=True)


# 2,创建数据库引擎
from sqlalchemy import create_engine  # 创建数据库引擎
engine = create_engine("mysql+pymysql://root:123456@127.0.0.1:3306/sqlalchemy?charset=utf8")

# 3,将所有的继承Base的Class序列化数据表
# Base.metadata.create_all(engine)
Base.metadata.create_all(engine)
复制代码

参数说明:

  • __tablename__指定在MySql表中的名字
  • 类中的Column代表数据库中的一列
  • Integer代表数值型
  • String代表字符串

4.1,单标的增加:

复制代码
# 1,选中数据库 - 创建数据库引擎, 导入数据库引擎
# 2,创建查询窗口, 必须是选中数据库的查询窗口
# 3,创建sql语句
# 4,点击运行

# 1,选中数据库 - 创建数据库引擎,导入数据库引擎
from Single_table.create_table import engine, User

# 2,创建查询窗口,必须是选中数据库的查询窗口
from sqlalchemy.orm import sessionmaker
Session_window = sessionmaker(engine)

# 打开查询窗口
db_session = Session_window()  # 实例化查询窗口对象

# 1,增加数据 - 创建sql语句
user_obj = User(name="帅爆太阳的男人")  # 创建sql语句
db_session.add(user_obj)  # 将sql语句粘贴到查询窗口中


# 点击运行
db_session.commit()  # 执行全部的sql语句
db_session.close()  # 关闭会话窗口


# 2,创建多条数据
user_obj_list = [User(name="雪雪"), User(name="小雪")]
db_session.add_all(user_obj_list)  # 将多个创建的值粘贴到查询窗口
db_session.commit()  # 提交要执行的sql语句
db_session.close()
复制代码

 

4.2,单标的查

复制代码
# 创建窗口
from Single_table.create_table import engine, User
from sqlalchemy.orm import sessionmaker
Session = sessionmaker(engine)  # 常见查询窗口
db_session = Session()  # 打开查询窗口

# 1,查询单条数据
user_obj = db_session.query(User).first()  # 从查询窗口中查询数据
print(user_obj.id, user_obj.name)

# 查询多条数据
user_obj_list = db_session.query(User).all()
print(user_obj_list)
for row in user_obj_list:
    print(row.id, row.name)


# 带条件的查询
user_obj_list = db_session.query(User).filter(User.id <= 2, User.name == "雪雪").all()
print(user_obj_list)
for row in user_obj_list:
    print(row.id, row.name)


user_obj_list = db_session.query(User).filter_by(id=2, name="雪雪").all()
print(user_obj_list)
for row in user_obj_list:
    print(row.id, row.name)

# 3 小雪
# [<Single_table.create_table.User object at 0x000002C0D560EAC8>, <Single_table.create_table.User object at 0x000002C0D560EEF0>, <Single_table.create_table.User object at 0x000002C0D560EE80>]
# 3 小雪
# 1 帅爆太阳的男人
# 2 雪雪
# [<Single_table.create_table.User object at 0x000002C0D560EE80>]
# 2 雪雪
# [<Single_table.create_table.User object at 0x000002C0D560EE80>]
# 2 雪雪
复制代码

4.3,单标的更新

复制代码
# 创建窗口
from Single_table.create_table import User, engine
from sqlalchemy.orm import sessionmaker  # 会话窗口

Session = sessionmaker(engine)  # 创建数据查询窗口
db_session = Session()  # 打开数据查询窗口

# 1,修改一条数据
user_obj = db_session.query(User).filter(User.id == 1).update({"name": "帅爆太阳那人"})
db_session.commit()  # 提交sql语句

# 2,修改多条数据
user_obj - db_session.query(User).filter(User.id >= 2).update({"name": "miss"})
db_session.commit()  # 提交sql语句
复制代码

4.4,单标的删除

复制代码
from sqlalchemy.orm import sessionmaker
from Single_table.create_table import engine, User

# 1,创建数据窗口
Session = sessionmaker(engine)  # 库好里放的参数是要对那个数据库进行操作
db_session = Session()  # 打开数据查询窗口


# 1,删除数据
res = db_session.query(User).filter(User.id == 1).delete()  # 直接queryset对象就可以直接删除
db_session.commit()


# 2,删除多条数据
res = db_session.query(User).filter(User.id >=1).delete()
db_session.commit()  # 提交sql语句
复制代码

5,Foreignkey(一对多)

  • 5.1创建表和连接
复制代码
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column, INT, VARCHAR, ForeignKey
from sqlalchemy.orm import relationship

# 实例化基类
Base = declarative_base()


class Student(Base):
    __tablename__ = "student"
    id = Column(INT, primary_key=True)
    name = Column(VARCHAR(32))
    school_id = Column(INT, ForeignKey("school.id"))
    stu2sch = relationship("School", backref="sch2stu")  # backref反向查询的用到的字段


class School(Base):
    __tablename__ = "school"
    id = Column(INT, primary_key=True)
    name = Column(VARCHAR(32))


from sqlalchemy import create_engine
engine = create_engine("mysql+pymysql://root:123456@127.0.0.1:3306/sqlalchemy?charset=utf8")  # utf8, 不要写成utf-8
print(engine)
Base.metadata.create_all(engine)
复制代码

student和school多对一,relationship指定外键关系

  • 5.2外键关系的增加
复制代码
from sqlalchemy.orm import sessionmaker
from foreignKey.create_table import Student, School, engine
Session = sessionmaker(engine) # 创建数据查询窗口
db_session = Session() # 打开数据查询窗口

# 1增加数据
sch_obj = School(name="OldBoyBeijing")
db_session.add(sch_obj) # 把要执行的orm操作语句
db_session.commit() # 提交成要操作的sql语句

sch_obj = db_session.query(School).filter(School.name=="OldBoyBeijing").first()

stu_obj = Student(name="帅爆太阳的男人", school_id=sch_obj.id) # 通过学校,查找该学校所有的学生

db_session.add(stu_obj) # 把orm的语句放到数据查询窗口
db_session.commit() # 提交sql语句

# 2,Relationship 添加数据操作 ---正向
stu_obj = Student(name="帅爆太阳的男人", stu2sch=School(name="OldBoyBeijing")) # 直接通过relationship直接定位到学校
db_session.add(stu_obj)
db_session.commit()


# Relationship - 反向
sch_obj = School(name="OldBoyBeijing") # 先查到学校对象
sch_obj.sch2stu = [Student(name="雪雪"), Student(name="小雪")] # 在根据relationship查找到这个学校的所有学生
db_session.add(sch_obj)
db_session.commit()
复制代码
  • 5.2外键关系的查询
复制代码
from sqlalchemy.orm import sessionmaker
from foreignKey.create_table import engine, Student, School

Session = sessionmaker(engine)  # 创建数据查询窗口
db_session = Session()

# 1,查询
sch_obj = db_session.query(School).filter(School.name=="OldBoyBeijing").first()
beijing_stu_obj = db_session.query(Student).filter(Student.school_id==sch_obj.id).first()
print(beijing_stu_obj.name, beijing_stu_obj.id)  # 帅爆太阳的男人 1

# 2,relatership 正向查询
stu_obj = db_session.query(Student).filter(Student.name == "帅爆太阳的男人").first()
print(stu_obj.name, stu_obj.stu2sch.name)  # 帅爆太阳的男人 OldBoyBeijing


# 3,relationship   反向查询
sch_obj_list = db_session.query(School).all()
for row in sch_obj_list:
    for stu in row.sch2stu:
        print(row.name, stu.name)
# OldBoyBeijing 帅爆太阳的男人
# OldBoyBeijing 帅爆太阳的男人
# OldBoyBeijing 雪雪
# OldBoyBeijing 小雪
复制代码

6,多对多关系的表

  • 6.1,多对多表的创建和连接
复制代码
from sqlalchemy.ext.declarative import declarative_base
Base = declarative_base()  # 实例化declarative_base

from sqlalchemy import Column, Integer, String, ForeignKey
from sqlalchemy.orm import relationship


class Girls(Base):
    __tablename__ = "girl"
    id = Column(Integer, primary_key=True)
    name = Column(String(32))
    g2b = relationship("Boys", backref="b2g", secondary="hotel")  # backref是反向查询的字段


class Boys(Base):
    __tablename__ = "boy"
    id = Column(Integer, primary_key=True)
    name = Column(String(32))


class Hotel(Base):
    __tablename__ = "hotel"
    id = Column(Integer, primary_key=True)
    boy_id = Column(Integer, ForeignKey("boy.id"))
    girl_id = Column(Integer, ForeignKey("girl.id"))


from sqlalchemy import create_engine
engine = create_engine("mysql+pymysql://root:123456@127.0.0.1:3306/sqlalchemy")
print(engine)
Base.metadata.create_all(engine)
复制代码
  • 6.2多对多表的插入数据
复制代码
from Many_to_Many.create_table_M2M import engine, Girls, Boys, Hotel
from sqlalchemy.orm import sessionmaker
Session = sessionmaker(engine)  # 创建一个会话窗口
db_session = Session()  # 打开一个 会话窗口

# 1增加数据  -- relationship正向
girl_obj = Girls(name="雪雪")
girl_obj.g2b = [Boys(name="帅爆太阳的男人")]
db_session.add(girl_obj)  # 把增加的数据窗口
db_session.commit()  # 将存放于窗口的数据提交到数据库中


# 2增加数据 - relationship 反向
boy_obj = Boys(name="胡夏")
boy_obj.b2g = [Girls(name="郁可唯"), Girls(name="谢大脚")]
db_session.add(boy_obj)
db_session.commit()  # 提交到数据库
复制代码
  • 6.3多对多表的查询
复制代码
from Many_to_Many.create_table_M2M import engine, Girls, Boys
from sqlalchemy.orm import sessionmaker
Session = sessionmaker(engine)  # 创建会话窗口
db_session = Session()  # 打开会话窗口


# 1查询数据 - relationship  正向
girl_obj_list = db_session.query(Girls).all()  # 查询所有的女生
print(girl_obj_list)
for girl in girl_obj_list:
    print(girl)  # <Many_to_Many.create_table_M2M.Girls object at 0x000001F6E5344908>
    for boy in girl.g2b:  # 通过外键拿到
        print(girl.name,boy.name)

# 2查询数据 - relationship  - 反向
boy_obj_list = db_session.query(Boys).all()
for boy in boy_obj_list:
    for girl in boy.b2g:
        print(girl.name, boy.name)
复制代码

7,SQLAlchemy的进阶操作

  • 7.1创建表和建立连接
复制代码
# ORM
# 1,class - obj
# 2,将所有的class序列化成数据
# 3,将所有的class序列化成数据表
# 4,ORM操作 -CRUD


# 1创建一个表class
from sqlalchemy.ext.declarative import declarative_base
Base = declarative_base()
# Base 是ORM的模型类, 基类
# ORM模型 -obj里面的属性 == table中创建的字段
# -obj定义table的操作方式和属性

from sqlalchemy import Column, Integer, String


class People(Base):
    __tablename__ = "people"
    id = Column(Integer, primary_key=True, autoincrement=True)
    name = Column(String(32), index=True)
    age = Column(Integer)
    gender = Column(String(32))
    
    
# 2创建数据库引擎
from sqlalchemy import create_engine
engine = create_engine("mysql+pymysql://root:123456@127.0.0.1:3306/sqlalchemy")
# engine = create_engine("mysql+pymysql://root:123456@127.0.0.1:3306/sqlalchemy")

# 将所有的继承Base的Class序列化成数据表
Base.metadata.create_all(engine)
复制代码
  • 7.2进阶操作的增加
复制代码
from sqlalchemy.orm import sessionmaker
from advanced.create_table_advanced import engine, People
Session_window = sessionmaker(engine)
# 打开查询窗口
db_session = Session_window()


# 增加多条数据
user_obj_list = [People(name="小雪", age=18, gender="女"), People(name="雪人", age=23, gender="女"), People(name="刘夏", age=22, gender="女")]
db_session.add_all(user_obj_list)
print(db_session)
db_session.commit()
db_session.close()
复制代码
  • 7.3进阶操作的增加
复制代码
from sqlalchemy.orm import sessionmaker
from advanced.create_table_advanced import engine, People
Session_window = sessionmaker(engine)
# 打开查询窗口
db_session = Session_window()


# 增加多条数据
user_obj_list = [People(name="小雪", age=18, gender="女"), People(name="雪人", age=23, gender="女"), People(name="刘夏", age=22, gender="女")]
db_session.add_all(user_obj_list)
print(db_session)
db_session.commit()
db_session.close()
复制代码
  • 7.4,进阶操作的
复制代码
from advanced.create_table_advanced import engine, People
from sqlalchemy.orm import sessionmaker
Session = sessionmaker(engine)
db_session = Session()

# 引用增加, 批量曹组,也可以筛选出来做批量操作
res = db_session.query(People).update({People.age:People.age+20}, synchronize_session=False)
print(res)  # 显示操作成功几个

db_session.query(People).filter(People.id>0).update({"age":People.age+30}, synchronize_session="evaluate")
db_session.commit()
复制代码
posted @ 2019-03-21 19:54  帅爆太阳的男人  阅读(784)  评论(0编辑  收藏  举报