orm_sqlalchemy
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

163 lines
5.4 KiB

import sqlalchemy
from sqlalchemy.orm import declarative_base, sessionmaker, Session, relationship, backref # declarative 声明式
from sqlalchemy import create_engine, Column, Integer, String, DATE, Enum, func, desc, or_, and_, update, case, union, \
union_all
# 创建数据引擎
HOST = "home.rogersun.cn"
USER = "root"
PWD = "Sxzgx1209"
PORT = "3306"
DB = "orm_sqlalchemy"
URI = f"mysql+pymysql://{USER}:{PWD}@{HOST}:{PORT}/{DB}?charset=utf8"
engine = create_engine(URI, echo=True)
# 创建session
SessionClass = sessionmaker(bind=engine)
session = SessionClass()
# # with Session
# with Session(engine) as db_session:
# session.begin()
# try:
# db_session.add("some_object")
# db_session.add("some_other_object")
# except:
# db_session.rollback()
# raise
# else:
# db_session.commit()
# 生成orm基类
Base = declarative_base()
# 创建表结构
class User(Base):
__tablename__ = 'user'
id = Column(Integer, primary_key=True)
name = Column(String(32))
password = Column(String(64))
def __repr__(self):
return "<%s name:%s>" % (self.id, self.name)
class Student(Base):
__tablename__ = 'student'
id = Column(Integer, primary_key=True)
name = Column(String(32), nullable=False)
gender = Column(Enum('m', 'f'), nullable=False)
date = Column(DATE, nullable=False)
def __repr__(self):
return f"<{self.id}-{self.name}-{self.gender}-{self.date}>"
# 生成实体表
# Base.metadata.create_all(engine)
# insert
# 创建数据
user_data_1 = User(name="roger", password="123321")
user_data_2 = User(name="honey", password='123456')
#
# # 插入数据
# session.add(user_data_1)
# session.add(user_data_2)
#
# # 提交数据
# session.commit()
# insert完整示例
# try:
# session.add(user_data_1)
# except Exception as e:
# print(e)
# session.rollback()
# else:
# session.commit()
# select
# result = session.query(User).all() # all
# result = session.query(User).filter_by(name='roger').all() # filter_by
# result = session.query(User).filter(User.id == 2).all() # filter
# result = session.query(User).filter(User.id >= 2).first() # first
# result = session.query(User).filter(User.id >= 2).order_by(User.id.desc()).all() # order_by desc
# result = session.query(User).filter(User.id >= 2).filter(User.name.like('%one%')).all() # like
# result = session.query(User).filter(User.id.in_([1, 2, 3])).all() # in
# # in startswith
# result = session.query(User).filter(
# User.id.in_(session.query(User.id).filter(User.name.startswith('he')))
# ).all()
# result = session.query(User).filter(User.id.notin_([1, 2])).all() # notin
# result = session.query(User).filter(User.password is None).all() # is None
# result = session.query(User).filter(User.password.is_(None)).all() # is_(None)
# result = session.query(User).filter(User.password is not None).all() # is not None
# result = session.query(User).filter(User.password.isnot(None)).all() # isnot(None)
# result = session.query(User).filter(or_(User.id > 2, User.name.ilike('Rog%'))).all() # or_
# result = session.query(User).filter(and_(User.id >= 2, User.name.endswith('ei'))).all() # and_ endswith
# result = session.query(User.name.label('user_name'), User.password).filter(User.id >= 2).all() # label print(result[0].user_name)
# result = session.query(User).filter(User.id > 1).count() # count
# try:
# result = session.query(User).filter(User.id > 1).one() # one 当仅查询到一个结果时返回,否则抛出异常
# except Exception as e:
# print(e)
# result = session.query(User).filter(User.id == 1).one_or_none() # one_or_none 当查询结果仅一条时显示返回结果,当没有结果时返回None,否则抛出异常
# result = session.query(User).filter(User.id == 1).scalar() # 调用one方法,并在成功时返回行的第一列
result = session.query(User).filter(User.id > 1).group_by(User.password)
# result = session.query(func.max(User.id)).all() # func.max
# print(result[0].name, result[0].password)
print(result) # 定义 __repr__ 后可以打印
# join
# filter形式
# result = session.query(User, Student).filter(User.name == Student.name).all()
# print(result[0].User.name, result[0].User.password, result[0].Student.name, result[0].Student.gender,
# result[0].Student.date)
#
# # join形式 无外键关联的情况
# result = session.query(User).join(Student, User.name == Student.name).all()
# print(result[0].name, result[0].password)
# join有外键关联的情况(Todo)
# union
# union
# q1 = session.query(User.name).filter(User.id > 1)
# q2 = session.query(Student.name).filter(Student.id <= 2)
# result = q1.union(q2).all()
# print(result)
# union_all
# q1 = session.query(User.id, User.name)
# q2 = session.query(Student.id.label('id'), Student.name.label('name'))
# result = q1.union_all(q2).filter(User.id <= 2)
# print(dict(result))
# for r in result:
# print(r)
# # update
# 一般形式
# data = session.query(User).filter(User.id == 1).first()
# print(data)
# data.name = 'rogersun'
# session.commit()
# 连写形势
# data = session.query(User).filter(User.id == 2).update({'name': 'honeyhoney'})
# session.commit()
# 批量更新
# data = session.query(User).filter(User.password.isnot(None)).update({User.password: '123321'})
# print(data)
# session.commit()
# delete
# result = session.query(User).filter(User.name == 'delete').delete()
# print(result)
# session.commit()
# 关闭session
session.close()