sqlchemy(重点)

今日内容:sqlchemy

SQLAlchemy:Python编程语言下的一款ORM框架,该框架建立在数据库API之上,使用关系对象映射进行数据库操作,简言之便是:将对象转换成SQL,然后使用数据API执行SQL并获取执行结果。

一.创建表

from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column, Integer, String, ForeignKey, UniqueConstraint, Index
from sqlalchemy.orm import sessionmaker, relationship
from sqlalchemy import create_engine

 

engine = create_engine("mysql+pymysql://用户名:密码@IP地址:端口号/数据库名?charset=utf8", max_overflow=5(最大连接))
Base = declarative_base()

创建单表:

class UserType(Base):
    __tablename__ = 'usertype'  # 表名
    id = Column(Integer, autoincrement=True, primary_key=True)
    title = Column(String(32), nullable=False, server_default='')
class users(Base):
    __tablename__ = 'users'  # 表名
    id = Column(Integer, autoincrement=True, primary_key=True)
    name = Column(String(32), nullable=False, server_default='')
    extra = Column(String(32), nullable=False, server_default='')
    type_id = Column(Integer, ForeignKey(UserType.id)) #type_id与usertype表的id设置外键关联
   usertype = relationship('UserType', backref='xxoo') # 正向,反向查询 详情看注释

 注释:usertype = relationship('UserType')正向查询,给自己的表创建一个隐藏列,可以点出对方表的列名

   usertype = relationship(backref='xxoo') 反向查询,给对方表创建一个隐藏列,可以点出自己表的列名

# 一对多

class Favor(Base):
    __tablename__ = 'favor'
    nid = Column(Integer, primary_key=True)
    caption = Column(VARCHAR(50), default='red', unique=True)
 
 
class Person(Base):
    __tablename__ = 'person'
    nid = Column(Integer, primary_key=True)
    name = Column(VARCHAR(32), index=True, nullable=True)
    favor_id = Column(Integer, ForeignKey("favor.nid"))
 
 
# 多对多
class Group(Base):
    __tablename__ = 'group'
    id = Column(Integer, primary_key=True)
    name = Column(VARCHAR(64), unique=True, nullable=False)
    port = Column(Integer, default=22)
 
 
class Server(Base):
    __tablename__ = 'server'
    id = Column(Integer, primary_key=True, autoincrement=True)
    hostname = Column(VARCHAR(64), unique=True, nullable=False)
 
 
class ServerToGroup(Base):
    __tablename__ = 'servertogroup'
    nid = Column(Integer, primary_key=True, autoincrement=True)
    server_id = Column(Integer, ForeignKey('server.id'))
    group_id = Column(Integer, ForeignKey('group.id'))
 
def init_db():
    Base.metadata.create_all(engine)

def drop_db():
    Base.metadata.drop_all(engine)


2、操作表

from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column, Integer, String, ForeignKey, UniqueConstraint, Index
from sqlalchemy.orm import sessionmaker, relationship
from sqlalchemy import create_engine

engine = create_engine("mysql+pymysql://root:123@127.0.0.1:3306/t1", max_overflow=5)

Base = declarative_base()

# 创建单表
class Users(Base):
    __tablename__ = 'users'
    id = Column(Integer, primary_key=True)
    name = Column(VARCHAR(32))
    extra = Column(VARCHAR(16))

    __table_args__ = (
    UniqueConstraint('id', 'name', name='uix_id_name'),
        Index('ix_id_name', 'name', 'extra'),
    )

    def __repr__(self):
        return "%s-%s" %(self.id, self.name)

# 一对多
class Favor(Base):
    __tablename__ = 'favor'
    nid = Column(Integer, primary_key=True)
    caption = Column(VARCHAR(50), default='red', unique=True)

    def __repr__(self):
        return "%s-%s" %(self.nid, self.caption)

class Person(Base):
    __tablename__ = 'person'
    nid = Column(Integer, primary_key=True)
    name = Column(String(32), index=True, nullable=True)
    favor_id = Column(Integer, ForeignKey("favor.nid"))
    # 与生成表结构无关,仅用于查询方便
    favor = relationship("Favor", backref='pers')

# 多对多
class ServerToGroup(Base):
    __tablename__ = 'servertogroup'
    nid = Column(Integer, primary_key=True, autoincrement=True)
    server_id = Column(Integer, ForeignKey('server.id'))
    group_id = Column(Integer, ForeignKey('group.id'))
    group = relationship("Group", backref='s2g')
    server = relationship("Server", backref='s2g')

class Group(Base):
    __tablename__ = 'group'
    id = Column(Integer, primary_key=True)
    name = Column(String(64), unique=True, nullable=False)
    port = Column(Integer, default=22)
    # group = relationship('Group',secondary=ServerToGroup,backref='host_list')


class Server(Base):
    __tablename__ = 'server'

    id = Column(Integer, primary_key=True, autoincrement=True)
    hostname = Column(String(64), unique=True, nullable=False)

 

Session = sessionmaker(bind=engine) # 绑定引擎
session = Session()  # 实例化
增加一条数据:
obj = Users(name="alex0", extra='sb')
session.add(obj)
增加多条数据
session.add_all([
    Users(name="alex1", extra='sb'),
    Users(name="alex2", extra='sb'),
])
session.commit()
删除
session.query(Users).filter(Users.id > 2).delete()
session.commit()
修改
session.query(Users).filter(Users.id > 2).update({"name" : "099"})
session.commit()
查询

ret = session.query(Users).all()   返回一个列表,里面存放对象 

res = session.query(UserType).filter(UserType.title=='VIP用户',UserType.id==2).all()  查询单条 where条件查询指定的一条,返回值列表,里面存放对象
print(res[0].title)
res = session.query(UserType).first()   # 查询单条 first 返回第一条
print(res.title)
between  ......and ..   返回值 列表
res = session.query(UserType).filter(UserType.id.between(1,5)).all()
for row in res:
    print(row.id,row.title)
in  操作  (res返回的是sql语句)
res = session.query(UserType).filter(UserType.id.in_([1,2,3])).all()
for row in res:
    print(row.id,row.title)

~in_ 表示 notin_,表示取反 (res返回的是sql语句)
res = session.query(UserType).filter(~UserType.id.in_([1,2,3])).all()
for row in res:
    print(row.id,row.title)
and 和 or的操作
from sqlalchemy import and_, or_

ret = session.query(Users).filter(and_(Users.id > 3, Users.name == 'eric')).all()
ret = session.query(Users).filter(or_(Users.id < 2, Users.name == 'eric')).all()
ret = session.query(Users).filter(
    or_(
        Users.id < 2,
        and_(Users.name == 'eric', Users.id > 3),
        Users.extra != ""
    )).all()
 通配符

ret = session.query(Users).filter(Users.name.like('e%')).all()
ret = session.query(Users).filter(~Users.name.like('e%')).all()
# 限制  limit 
ret = session.query(Users)[1:2]
# 排序
ret = session.query(Users).order_by(Users.name.desc()).all()
ret = session.query(Users).order_by(Users.name.desc(), Users.id.asc()).all()
# 分组
from sqlalchemy.sql import func

ret = session.query(Users).group_by(Users.extra).all()
ret = session.query(
    func.max(Users.id),
    func.min(Users.id)).group_by(Users.name).all()

ret = session.query(
    func.max(Users.id),
    func.min(Users.id)).group_by(Users.name).having(func.min(Users.id) >2).all()
# 连表

# join默认内连接
ret = session.query(Users, Favor).filter(Users.id == Favor.nid).all()

# isouter=True  改为外连接,默认左连接
ret = session.query(Person).join(Favor, isouter=True).all()

 

posted @ 2019-06-18 22:20  坚信会有奥特曼~  阅读(622)  评论(0)    收藏  举报