2.0学习进度 80%

main
roger 1 year ago
parent 851938bc08
commit 23cf8bb940
  1. 166
      sqlalchemy_20/db.py
  2. 3
      sqlalchemy_20/db_obj.py

@ -1,4 +1,4 @@
from sqlalchemy import create_engine, text, insert, update, select, delete, engine_from_config from sqlalchemy import create_engine, text, insert, update, select, delete, engine_from_config, or_, and_, func
from sqlalchemy.orm import Session, sessionmaker from sqlalchemy.orm import Session, sessionmaker
import configparser import configparser
import sys import sys
@ -13,7 +13,7 @@ PWD = "Sxzgx1209"
PORT = "3306" PORT = "3306"
DB = "orm_sqlalchemy" DB = "orm_sqlalchemy"
URI = f"mysql+pymysql://{USER}:{PWD}@{HOST}:{PORT}/{DB}?charset=utf8" URI = f"mysql+pymysql://{USER}:{PWD}@{HOST}:{PORT}/{DB}?charset=utf8mb4"
engine = create_engine( engine = create_engine(
URI, URI,
@ -59,22 +59,22 @@ engine = create_engine(
# conn.commit() # conn.commit()
# 获取结果 # 获取结果
stmt = text("SELECT * FROM user") # stmt = text("SELECT * FROM user")
with engine.connect() as conn: # with engine.connect() as conn:
result = conn.execute(stmt) # result = conn.execute(stmt)
# 解包赋值 # 解包赋值
# for _id, name, password in result: # for _id, name, password in result:
# print(f"name: {name}, password: {password}") # print(f"name: {name}, password: {password}")
# 列指定的名称 # 列指定的名称
# for row in result: # for row in result:
# name, password = row.name, row.password # name, password = row.name, row.password
# print(f"name: {name}, password: {password}") # print(f"name: {name}, password: {password}")
# 绑定模型 # 绑定模型
# result: [User] = result.fetchall() # result: [User] = result.fetchall()
# for row in result: # for row in result:
# name = row.name # name = row.name
# password = row.password # password = row.password
# print(f"name: {name}, password: {password}") # print(f"name: {name}, password: {password}")
# 创建Session实例 # 创建Session实例
# with Session(engine) as session: # with Session(engine) as session:
@ -120,17 +120,145 @@ insert_data2 = {'name': 'sql2_test2', 'password': 'pwd2'}
# insert 对象方式 批量 # insert 对象方式 批量
# insert_obj2 = User(name='sql2_test8', password='pwd8') # insert_obj2 = User(name='sql2_test8', password='pwd8')
# insert_obj3 = User(name='sql2_test9', password='pwd9')
# with db_session as sess: # with db_session as sess:
# # sess.bulk_save_objects([insert_obj2, insert_obj3]) # # sess.bulk_save_objects([insert_obj2, insert_obj3])
# sess.add_all([insert_obj2, insert_obj3]) # sess.add_all([insert_obj2, insert_obj3])
# sess.commit() # sess.commit()
# add
# with db_session as sess:
# user_obj = User(name='add', password='addpwd123')
# sess.add(user_obj)
# sess.flush() # 刷新数据库表
# print(user_obj.id) # 获取数据对应id
# sess.commit()
# 查 # 查
# get 通过id # get 通过id
# result = db_session.get(User, 4) # result = db_session.get(User, 4)
# print(result) # print(result)
# sqlalchemy1.4: session.query(User).all()
# query_cursor = db_session.execute(select(User))
# print(query_cursor.all()) # 数据指针,当all取过数据后one将得到None
# print(query_cursor.first())
# for row in query_cursor.scalars():
# print(row) # row.name格式可以取到数据
# sqlalchemy1.4: session.query(User).filter_by(name='roger').all()
# sql_stmt = select(User).filter_by(name='roger')
# query_result = db_session.execute(sql_stmt).one()
# print(query_result)
# print(query_result[0].name)
# sqlalchemy1.4: session.query(User).filter(User.id == 2).all()
# sql_stmt = select(User).where(User.id == 2)
# query_result = db_session.execute(sql_stmt).scalars()
# for row in query_result:
# print(f"{row.id} - {row.name} - {row.password}")
# sqlalchemy1.4: session.query(User).filter(User.id >= 2).first()
# sql_stmt = select(User).where(User.id >= 2)
# query_result = db_session.execute(sql_stmt).scalars()
# for row in query_result:
# print(f"{row.id} - {row.name} - {row.password}")
# sqlalchemy1.4: session.query(User).filter(User.id >= 2).order_by(User.id.desc()).all()
# sql_stmt = select(User).where(User.id >= 2).order_by(User.id.desc())
# query_result = db_session.execute(sql_stmt).scalars()
# for row in query_result:
# print(f"{row.id} - {row.name} - {row.password}")
# sqlalchemy1.4: session.query(User).filter(User.id >= 2).filter(User.name.like('%one%')).all()
# sql_stmt = select(User).where(User.id >= 2).where(User.name.like('%one%'))
# query_result = db_session.execute(sql_stmt).scalars()
# for row in query_result:
# print(f"{row.id} - {row.name} - {row.password}")
# sqlalchemy1.4: session.query(User).filter(User.id.in_([1, 2, 3])).all()
# sql_stmt = select(User).where(User.id.in_([1, 2, 3]))
# query_result = db_session.execute(sql_stmt).scalars()
# for row in query_result:
# print(f"{row.id} - {row.name} - {row.password}")
# sqlalchemy1.4: session.query(User).filter(User.id.in_(session.query(User.id).filter(User.name.startswith('he')))).all()
# 连写
# sql_stmt = select(User).where(User.id.in_(
# db_session.execute(select(User.id).where(User.name.startswith('he'))).scalars()))
# query_result = db_session.execute(sql_stmt).scalars()
# for row in query_result:
# print(f"{row.id} - {row.name} - {row.password}")
# 拆分
# sql_stmt1 = select(User.id).where(User.name.startswith('he'))
# query_result1 = db_session.execute(sql_stmt1).scalars()
# sql_stmt2 = select(User).where(User.id.in_(query_result1))
# query_result2 = db_session.execute(sql_stmt2).scalars()
# for row in query_result2:
# print(f"{row.id} - {row.name} - {row.password}")
# sqlalchemy1.4: session.query(User).filter(User.id.notin_([1, 2])).all()
# sql_stmt = select(User).where(User.id.notin_([1, 2]))
# query_result = db_session.execute(sql_stmt).scalars()
# for row in query_result:
# print(f"{row.id} - {row.name} - {row.password}")
# sqlalchemy1.4: session.query(User).filter(User.password is None).all()
# sqlalchemy1.4: session.query(User).filter(User.password.is_(None)).all()
# sql_stmt = select(User).where(User.password.is_(None)) # 此处不支持 is None
# query_result = db_session.execute(sql_stmt).scalars()
# for row in query_result:
# print(f"{row.id} - {row.name} - {row.password}")
# sqlalchemy1.4: session.query(User).filter(User.password is not None).all()
# sqlalchemy1.4: session.query(User).filter(User.password.isnot(None)).all()
# sql_stmt = select(User).where(User.password.isnot(None)) # isnot()
# sql_stmt = select(User).where(User.password.is_not(None)) # is_not()
# query_result = db_session.execute(sql_stmt).scalars()
# for row in query_result:
# print(f"{row.id} - {row.name} - {row.password}")
# sqlalchemy1.4: session.query(User).filter(or_(User.id > 2, User.name.ilike('Rog%'))).all()
# sql_stmt = select(User).where(or_(User.id > 2, User.name.ilike('ROG%')))
# query_result = db_session.execute(sql_stmt).scalars()
# for row in query_result:
# print(f"{row.id} - {row.name} - {row.password}")
# sqlalchemy1.4: session.query(User).filter(and_(User.id >= 2, User.name.endswith('ei')))
# sql_stmt = select(User).where(and_(User.id >= 2, User.name.endswith('ei')))
# query_result = db_session.execute(sql_stmt).scalars()
# for row in query_result:
# print(f"{row.id} - {row.name} - {row.password}")
# sqlalchemy1.4: session.query(User.name.label('user_name'), User.password).filter(User.id >= 2).all()
# sql_stmt = select(User.name.label('user_name_label'), User.password.label('user_pwd_label')).where(User.id >= 2)
# query_result = db_session.execute(sql_stmt).all() # 返回 [('honeyhoney', '2222'), ('haha', '123321'), ('hehe', '3333')]
# query_result = db_session.execute(sql_stmt).scalars() # 返回 scalars 对象, 仅包含name
# query_result = db_session.execute(sql_stmt) # 返回 {'user_name_label': 'roger', 'user_pwd_label': 'rogerpwd123'} 建议此情况
# print(query_result)
# for row in query_result:
# print(row)
# for row in query_result.mappings():
# print(row['user_name_label'], row['user_pwd_label'])
# sqlalchemy1.4: session.query(User).filter(User.id > 1).count()
# sql_stmt = select(func.count()).select_from(User).where(User.id <= 2)
# query_result = db_session.execute(sql_stmt).scalar()
# print(query_result)
# 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__ 后可以打印
# select all scalars # select all scalars
# result = db_session.execute(select(User)).scalars().all() # [<1 name:rogersun>, <2 name:honeyhoney>, <3 name:haha>] # result = db_session.execute(select(User)).scalars().all() # [<1 name:rogersun>, <2 name:honeyhoney>, <3 name:haha>]
# print(result) # print(result)

@ -27,7 +27,8 @@ class Student(Base):
return f"<{self.id}-{self.name}-{self.gender}-{self.date}>" return f"<{self.id}-{self.name}-{self.gender}-{self.date}>"
Base.metadata.create_all(engine) Base.metadata.create_all(engine) # 创建全部表
User.__table__.create(engine) # 创建单个表
# 创建表结构 -- 命令式 # 创建表结构 -- 命令式

Loading…
Cancel
Save