1. 程式人生 > 其它 >單表操作

單表操作

單表操作

一、建立表

# model.py
import datetime
from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column, Integer, String, Text, ForeignKey, DateTime, UniqueConstraint, Index
from sqlalchemy.orm import relationship

Base = declarative_base()


# make_declarative_base

class Users(Base):
    __tablename__ = 'users'  # 資料庫表名稱
    id = Column(Integer, primary_key=True)  # id 主鍵
    name = Column(String(32), index=True, nullable=False)  # name列,索引,不可為空
    age = Column(Integer)
    email = Column(String(32), unique=True)
    # datetime.datetime.now不能加括號,加了括號,以後永遠是當前時間
    ctime = Column(DateTime, default=datetime.datetime.now)
    extra = Column(Text, nullable=True)

    def __repr__(self):
        return self.name


    __table_args__ = (
        UniqueConstraint('id', 'name', name='uix_id_name'), #聯合唯一
        Index('ix_id_name', 'name', 'email'), #索引
    )

def init_db():
    """
    根據類建立資料庫表
    :return:
    """
    engine = create_engine(
        "mysql+pymysql://root:[email protected]:3306/db_flask?charset=utf8",
        max_overflow=0,  # 超過連線池大小外最多建立的連線
        pool_size=5,  # 連線池大小
        pool_timeout=30,  # 池中沒有執行緒最多等待的時間,否則報錯
        pool_recycle=-1  # 多久之後對執行緒池中的執行緒進行一次連線的回收(重置)
    )

    Base.metadata.create_all(engine)


def drop_db():
    """
    根據類刪除資料庫表
    :return:
    """
    engine = create_engine(
        "mysql+pymysql://root:[email protected]:3306/db_flask?charset=utf8",
        max_overflow=0,  # 超過連線池大小外最多建立的連線
        pool_size=5,  # 連線池大小
        pool_timeout=30,  # 池中沒有執行緒最多等待的時間,否則報錯
        pool_recycle=-1  # 多久之後對執行緒池中的執行緒進行一次連線的回收(重置)
    )

    Base.metadata.drop_all(engine)


if __name__ == '__main__':
    # 建立表
    init_db()

    # 刪除表
    # drop_db()

二、各種條件查詢

2.1filter條件查詢

from sqlalchemy.orm import sessionmaker
from sqlalchemy import create_engine
from model import Users

engine = create_engine("mysql+pymysql://root:[email protected]:3306/db_flask", max_overflow=0, pool_size=5)
Session = sessionmaker(bind=engine)
session = Session()

# 1 filter條件查詢
# 多個條件是 and的關係
filter_by = session.query(Users).filter_by(name='randysun', age=18).all()
filter_by1 = session.query(Users).filter_by(name='randysun').all()

print(filter_by)
print(filter_by1)

# 表示式,and條件連線
ret1 = session.query(Users).filter(Users.id > 3, Users.name == 'randy').all()
print(ret1)

2.2 between查詢

from sqlalchemy.orm import sessionmaker
from sqlalchemy import create_engine
from model import Users

engine = create_engine("mysql+pymysql://root:[email protected]:3306/db_flask", max_overflow=0, pool_size=5)
Session = sessionmaker(bind=engine)
session = Session()

# 2. between查詢

between = session.query(Users).filter(Users.id.between(1,3)).all()
between_sql = session.query(Users).filter(Users.id.between(1,3))
print(between)
print(between_sql)

2.3 in 查詢

from sqlalchemy.orm import sessionmaker
from sqlalchemy import create_engine
from model import Users

engine = create_engine("mysql+pymysql://root:[email protected]:3306/db_flask", max_overflow=0, pool_size=5)
Session = sessionmaker(bind=engine)
session = Session()

# 3. in查詢,注意下劃線
res_in = session.query(Users).filter(Users.id.in_([1, 2, 3])).all()
res_in_sql = session.query(Users).filter(Users.id.in_([1, 2, 3]))
print(res_in)
print(res_in_sql)

2.4 ~ 非查詢

from sqlalchemy.orm import sessionmaker
from sqlalchemy import create_engine
from model import Users

engine = create_engine("mysql+pymysql://root:[email protected]:3306/db_flask", max_overflow=0, pool_size=5)
Session = sessionmaker(bind=engine)
session = Session()

# 4. ~ 非,除了什麼什麼之外 相當於not

# 相當於 sql中 not in(1, 2, 3)
res_in = session.query(Users).filter(~ Users.id.in_([1, 2, 3])).all()
res_in_sql = session.query(Users).filter(~ Users.id.in_([1, 2, 3]))
print(res_in)
print(res_in_sql)

2.5 二次篩選查詢

from sqlalchemy.orm import sessionmaker
from sqlalchemy import create_engine
from model import Users

engine = create_engine("mysql+pymysql://root:[email protected]:3306/db_flask", max_overflow=0, pool_size=5)
Session = sessionmaker(bind=engine)
session = Session()

# 5. 二次篩選 相當於sql中 select name from user where id in (select id from user where name='randy)
res = session.query(Users).filter(Users.id.in_(session.query(Users.id).filter_by(name='randy'))).all()
res_sql = session.query(Users).filter(Users.id.in_(session.query(Users.id).filter_by(name='randy')))
print(res)
print(res_sql)

2.6 萬用字元查詢

from sqlalchemy.orm import sessionmaker
from sqlalchemy import create_engine
from model import Users

engine = create_engine("mysql+pymysql://root:[email protected]:3306/db_flask", max_overflow=0, pool_size=5)
Session = sessionmaker(bind=engine)
session = Session()

# 6 萬用字元查詢 like

res = session.query(Users).filter(Users.name.like('_a%')).all()
res_sql = session.query(Users).filter(Users.name.like('_a%'))
print(res)
print(res_sql)

res = session.query(Users).filter(~Users.name.like('l%')).all()
res_sql = session.query(Users).filter(~Users.name.like('l%')).all()
print(ret)

2.7 區間查詢

from sqlalchemy.orm import sessionmaker
from sqlalchemy import create_engine
from model import Users

engine = create_engine("mysql+pymysql://root:[email protected]:3306/db_flask", max_overflow=0, pool_size=5)
Session = sessionmaker(bind=engine)
session = Session()

# 7 限制,區間查詢,用於分頁
res = session.query(Users)[0:10]
print(res)

2.8 排序

from sqlalchemy.orm import sessionmaker
from sqlalchemy import create_engine
from model import Users

engine = create_engine("mysql+pymysql://root:[email protected]:3306/db_flask", max_overflow=0, pool_size=5)
Session = sessionmaker(bind=engine)
session = Session()

# 8  排序,
# 1. 根據id升序排序
res = session.query(Users.id, Users.name).order_by(Users.id.asc()).all()
print(res)

# 2. 根據id,降序排序
res = session.query(Users.id, Users.name).order_by(Users.id.desc()).all()
print(res)

# 3. 第一個條件重複後,再按第二個條件升序排
ret = session.query(Users.id, Users.name).order_by(Users.id.asc(), Users.name.desc()).all()
print(ret)

2.9 分組

from sqlalchemy.orm import sessionmaker
from sqlalchemy import create_engine
from model import Users

engine = create_engine("mysql+pymysql://root:[email protected]:3306/db_flask", max_overflow=0, pool_size=5)
Session = sessionmaker(bind=engine)
session = Session()

# 10 分組

res = session.query(Users).group_by(Users.name).all()
print(res)

# 分組之後獲取最大的id, 最小id, id之和
# 使用函式需要匯入func模組
from sqlalchemy.sql import func

res = session.query(
    func.max(Users.id),
    func.min(Users.id),
    func.sum(Users.id),
    Users.name,
).group_by(Users.name).all()

print(res)

# haviing篩選
res = session.query(
    func.max(Users.id),
    func.min(Users.id),
    func.sum(Users.id),
    Users.name,
).group_by(Users.name).having(func.min(Users.id > 2)).all()
res_sql = session.query(
    func.max(Users.id),
    func.min(Users.id),
    func.sum(Users.id),
    Users.name,
).group_by(Users.name).having(func.min(Users.id > 2))

print(res)
print(res_sql)

三、and 和 or查詢

匯入模組from sqlalchemy import and_, or_

from sqlalchemy.orm import sessionmaker
from sqlalchemy import create_engine
from model import Users

engine = create_engine("mysql+pymysql://root:[email protected]:3306/db_flask", max_overflow=0, pool_size=5)
Session = sessionmaker(bind=engine)
session = Session()

from sqlalchemy import and_, or_

# or_包裹的都是or條件,and_包裹的都是and條件

# 1.and_
res = session.query(Users).filter(and_(Users.id > 3, Users.name == 'randy')).all()
res_sql = session.query(Users).filter(and_(Users.id > 3, Users.name == 'randy'))
print(res)
print(res_sql)

# 2. or_
res = session.query(Users).filter(or_(Users.id < 2, Users.name == 'randy')).all()
res_sql = session.query(Users).filter(or_(Users.id < 2, Users.name == 'randy'))
print(res)
print(res_sql)

# 3. or_ and_共同查詢
res = session.query(Users).filter(
    or_(
        Users.id < 2,
        and_(Users.name == 'randy', Users.id > 3)
    )).all()
res_sql = session.query(Users).filter(
    or_(
        Users.id < 2,
        and_(Users.name == 'randy', Users.id > 3)
    ))
print(res)
print(res_sql)

四、總結

  • filter系列查詢:多個條件表示and關係
  • between:區間查詢,1,3兩者之間
  • in: 包含查詢
  • ~: 非查詢, 相當於sql中 not
  • and_和or_: 需要匯入這連個模組,可以巢狀使用
  • like: 模糊匹配, _表示任意單個字元, %表示任意多個字元
  • order_by: 排序, asc升序,desc降序
  • group_by: 分組查詢,如果要使用聚合函式需要匯入fun模組,分組之後查詢條件使用 having
在當下的階段,必將由程式設計師來主導,甚至比以往更甚。