'''
一种思想:ORM(Object Relationship Mapping) 对象关系映射
基于这种思想开发的产品,python比较出名的ORM的框架:SQLAlchemy
DB frist:先有数据库,再有后续的操作
Code frist:先有代码,通过代码创建DB
'''
from sqlalchemy import create_engine, UniqueConstraint, Index, Column, Integer, String, ForeignKey, func
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.sql.expression import text
from sqlalchemy.orm import sessionmaker, relationship
# 连接数据库 max_overflow 表示最大连接数
engine = create_engine("mysql+pymysql://root:456@127.0.0.1:3306/db2? charset=utf8", max_overflow=5)
#继承了元类,重写了类的定义的方法
Base = declarative_base()
class UserType(Base):
__tablename__ = 'usertype'
id = Column(Integer, autoincrement=True, primary_key=True)
name = Column(String(32), nullable=False, default='')
class Users(Base):
__tablename__ = 'user'
uid = Column(Integer, autoincrement=True, primary_key=True)
uname = Column(String(32), nullable=False, server_default='', unique=True)
extra = Column(String(32), nullable=False, server_default='', index=True)
# 外键约束
type_id = Column(Integer, ForeignKey(UserType.id))
#那张表有外键,relationship就写到哪,用来正向查询和反向查询的
#usertype表示对应UserType这张表的数据,相当于再自己(Users)多了一个隐藏字段,不会显示
#backref表示再usertype中多了一个隐藏字段xxoo,xxoo代表该表的多条记录对象
usertype = relationship('UserType', backref='xxoo')
__table_args__ = (
UniqueConstraint('id','name', name='uix_id_name'),#联合唯一索引
Index('ix_name_extra','name','extra') #联合索引
)
def create_db():
# 会将当前执行文件中继承自Base类的类创建成表
Base.metadata.create_all(engine)
def drop_db():
# 删除表
Base.metadata.drop_all(engine)
###增删改查
Session = sessionmaker(bind=engine)
session = Session()
# 增加一条
obj_ut = UserType(name='Centurion')
session.add(obj_ut)
# 增加多条
session.add_all([
Users(uname='zs', extra='sb', type_id=1),
Users(uname='eric', extra='cb', type_id=3),
Users(uname='zxx', extra='zb', type_id=1),
Users(uname='owen', extra='nb', type_id=