SQLAlchemy

一、介绍

基于Python语言,是Python的一个ORM框架,ORM将对象的各个方法翻译成SQL语句,通过DB-API执行。

DB-API : 是Python的数据库接口规范

 

二、下载

pip install sqlalchemy

 

三、单表的创建

# 导入SQLAlchemy
from sqlalchemy import Column,String,Integer
from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base

# 创建对象的基类
Base = declarative_base()

# 初始化数据库连接
engine = create_engine(
    "mysql+pymysql://root:@127.0.0.1:3306/mysqlalchemydb?charset=utf8",
    max_overflow = 0,   # 超过连接池大小外最多创建的连接数
    pool_size = 5,      # 连接池大小
    pool_timeout = 30,  # 连接池中没有线程最多等待时间,否则报错
    pool_recycle = -1   # 多久之后对连接池中的连接进行回收(重置)-1不回收
)

class Book(Base):
    # 表的名字
    __tablename__ = 'book'

    # 表的结构
    id = Column(Integer,primary_key=True)
    title = Column(String(32),nullable=True)

if __name__ == '__main__':
    # 创建表
    Base.metadata.create_all(engine)
    
    # 删除表
    Base.metadata.drop_all(engine)

四、一对多的创建和数据添加

# 导入SQLAlchemy
from sqlalchemy import Column,String,Integer,ForeignKey
from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import relationship


# 创建对象的基类
Base = declarative_base()

# 初始化数据库连接
engine = create_engine(
    "mysql+pymysql://root:@127.0.0.1:3306/mysqlalchemydb?charset=utf8",
    max_overflow = 0,   # 超过连接池大小外最多创建的连接数
    pool_size = 5,      # 连接池大小
    pool_timeout = 30,  # 连接池中没有线程最多等待时间,否则报错
    pool_recycle = -1   # 多久之后对连接池中的连接进行回收(重置)-1不回收
)

class Book(Base):
    # 表的名字
    __tablename__ = 'book'

    # 表的结构
    id = Column(Integer,primary_key=True)
    title = Column(String(32),nullable=True)
    publisher_id = Column(Integer,ForeignKey("publisher.id"))

    # relationship 不生成字段建立关系,用于操作
    # backref 反向查询的字段
    publisher = relationship("Publisher",backref="books")

class Publisher(Base):
    # 表的名字
    __tablename__ = 'publisher'

    # 表的结构
    id = Column(Integer,primary_key=True)
    title = Column(String(32),nullable=True)



from sqlalchemy.orm import sessionmaker,scoped_session
# 绑定数据库连接,生成管理器对象,但是线程不安全
Session = sessionmaker(bind=engine)

# 重新创造对象保证线程安全
session = scoped_session(Session)

# # 创建表
Base.metadata.create_all(engine)
# # 删除表
# Base.metadata.drop_all(engine)


# 生成对象,并用外键id创建数据
publisher_obj = Publisher(title="深圳出版社")
book_obj = Book(title="数学之美",publisher_id=1)    # 存放外键的id
session.add(publisher_obj)
session.commit()
session.close()


# # 生成对象,并用外键对象创建数据
publisher_obj = Publisher(title="上海出版社")
book_obj = Book(title="语文之美",publisher=publisher_obj)    # 存放外键的id
session.add(publisher_obj)
session.commit()
session.close()

五、多对多关系表的创建

# 导入SQLAlchemy
from sqlalchemy import Column,String,Integer,ForeignKey,UniqueConstraint
from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import relationship


# 创建对象的基类
Base = declarative_base()

# 初始化数据库连接
engine = create_engine(
    "mysql+pymysql://root:@127.0.0.1:3306/mysqlalchemydb?charset=utf8",
    max_overflow = 0,   # 超过连接池大小外最多创建的连接数
    pool_size = 5,      # 连接池大小
    pool_timeout = 30,  # 连接池中没有线程最多等待时间,否则报错
    pool_recycle = -1   # 多久之后对连接池中的连接进行回收(重置)-1不回收
)

class Book(Base):
    # 表的名字
    __tablename__ = 'book'

    # 表的结构
    id = Column(Integer,primary_key=True)
    title = Column(String(32),nullable=True)

    # relationship 不生成字段建立关系,用于操作
    # backref 反向查询的字段
    # secondary 关联第三张表
    tags = relationship("Tag",backref="books",secondary="book2tag")

    # 只有__repr__,面向开发人员
    def __repr__(self):
        return self.title

class Tag(Base):
    __tablename__ = "tag"

    id = Column(Integer, primary_key=True)
    title = Column(String(32), nullable=True)

    # 只有__repr__,面向开发人员
    def __repr__(self):
        return self.title

    __table_args__ = (
        # 联合唯一
        UniqueConstraint("id","title",name="uni_id_title"),
    )
# 多对多关系关联的表
class Book2Tag(Base):
    __tablename__ = "book2tag"

    id = Column(Integer,primary_key=True)
    book_id = Column(Integer,ForeignKey("book.id"))
    tag_id = Column(Integer,ForeignKey("tag.id"))



from sqlalchemy.orm import sessionmaker,scoped_session
# 绑定数据库连接,生成管理器对象,但是线程不安全
Session = sessionmaker(bind=engine)

# 重新创造对象保证线程安全
session = scoped_session(Session)

# # 创建表
Base.metadata.create_all(engine)
# # 删除表
# Base.metadata.drop_all(engine)

六、基本操作

# 导入SQLAlchemy
from sqlalchemy import Column,String,Integer,ForeignKey,UniqueConstraint
from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import relationship


# 创建对象的基类
Base = declarative_base()

# 初始化数据库连接
engine = create_engine(
    "mysql+pymysql://root:@127.0.0.1:3306/mysqlalchemydb?charset=utf8",
    max_overflow = 0,   # 超过连接池大小外最多创建的连接数
    pool_size = 5,      # 连接池大小
    pool_timeout = 30,  # 连接池中没有线程最多等待时间,否则报错
    pool_recycle = -1   # 多久之后对连接池中的连接进行回收(重置)-1不回收
)

class Book(Base):
    # 表的名字
    __tablename__ = 'book'

    # 表的结构
    id = Column(Integer,primary_key=True)
    title = Column(String(32),nullable=True)

    # relationship 不生成字段建立关系,用于操作
    # backref 反向查询的字段
    # secondary 关联第三张表
    tags = relationship("Tag",backref="books",secondary="book2tag")

    # 只有__repr__,面向开发人员
    def __repr__(self):
        return self.title

class Tag(Base):
    __tablename__ = "tag"

    id = Column(Integer, primary_key=True)
    title = Column(String(32), nullable=True)

    # 只有__repr__,面向开发人员
    def __repr__(self):
        return self.title

    __table_args__ = (
        # 联合唯一
        UniqueConstraint("id","title",name="uni_id_title"),
    )
# 多对多关系关联的表
class Book2Tag(Base):
    __tablename__ = "book2tag"

    id = Column(Integer,primary_key=True)
    book_id = Column(Integer,ForeignKey("book.id"))
    tag_id = Column(Integer,ForeignKey("tag.id"))



from sqlalchemy.orm import sessionmaker,scoped_session
# 绑定数据库连接,生成管理器对象,但是线程不安全
Session = sessionmaker(bind=engine)

# 重新创造对象保证线程安全
session = scoped_session(Session)
表结构准备

增:

# 添加
tag_obj = Tag(title="基础")
tag_obj2 = Tag(title="进阶")
tag_obj3 = Tag(title="高级")

session.add(tag_obj)            # 添加单个
session.add_all([tag_obj2,tag_obj3])    # 批量添加

session.commit()        # 提交
session.close()         # 关闭session

查:

# 查询
ret1 = session.query(Tag).all()
print(ret1)     # [基础, 进阶, 高级]
ret2 = session.query(Tag).filter(Tag.id == 2).first()
ret3 = session.query(Tag).filter_by(id=3).first()
print(ret2)     # 进阶
print(ret3)     # 高级

改:

# 修改
session.query(Tag).filter_by(id=1).update({"title":"python"})
session.query(Tag).filter_by(id=2).update({Tag.title:"Linux"})
session.commit()        # 提交
session.close()         # 关闭

删:

# 删除
session.query(Tag).filter_by(id=3).delete()
session.commit()
session.close()

 

原文地址:https://www.cnblogs.com/st-st/p/10210605.html