实用:python中sqlalchemy中mysql数据库的简单查询和复杂查询

本文介绍了如何在Python中使用SQLAlchemy库进行MySQL数据库的简单和复杂查询,包括聚合函数、分组以及关联查询。通过示例展示了如何处理查询结果的去重问题,确保关联查询显示所有相关数据。
import sqlalchemy
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column,Integer,String,inspect,DATE,Enum,and_,or_,not_
from sqlalchemy.orm import sessionmaker

Base = declarative_base()

def show(emps):
    for x in emps:
        print(x)
    print('',end='\n\n')

class MyEnum(Enum):
    M = 'M'
    F = 'F'


class Employee(Base):
    __tablename__ = 'employees'
    emp_no = Column(Integer,primary_key=True)
    birth_date = Column(DATE,nullable=False)
    first_name = Column(String(14),nullable=False)
    last_name = Column(String(16),nullable=False)
    # gender = Column(MyEnum())
    hire_date = Column(DATE,nullable=False)

    def __repr__(self):
        return '<{} emp_no:{} name:{}>'.format(self.__class__.__name__,self.emp_no,'{}.{}'.format(self.first_name,self.last_name))

    __str__ = __repr__


host = '172.20.10.11'
port = '3306'
user = 'root'
passwd = '123456'
database = 'test'


conn_str = 'mysql+pymysql://{}:{}@{}:{}/{}'.format(user,passwd,host,port,database)
engine = sqlalchemy.create_engine(conn_str,echo=True)
Base.metadata.create_all(engine)
Session = sessionmaker()
session = Session(bind=engine)

#简单条件查询
print('#############################################################')
emps = session.query(Employee).filter(Employee.emp_no > 10015)
show(emps)

#复杂条件查询
#1.AND
print('-------------------------------------------------------------')
emps = session.query(Employee).filter(Employee.emp_no > 10015).filter(Employee.emp_no < 10018)
show(emps)
print('-------------------------------------------------------------')
emps = session.query(Employee).filter(and_(Employee.emp_no > 10015,Employee.emp_no < 10018))
show(emps)
print('-------------------------------------------------------------')
emps = session.query(Employee).filter((Employee.emp_no > 10015) & (Employee.emp_no < 10018))
show(emps)

#2.OR
print('+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++')
emps = session.query(Employee).filter(or_(Employee.emp_no > 10018,Employee.emp_no < 10003))
show(emps)
print('+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++')
emps = session.query(Employee).filter((Employee.emp_no > 10018) | (Employee.emp_no < 10003))
show(emps)

#3.NOT
print('@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@')
emps = session.query(Employee).filter(not_(Employee.emp_no < 10018))
show(emps)
print('@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@')
emps = session.query(Employee).filter(~(Employee.emp_no < 10018))
show(emps)


#4.IN
print('^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^')
emplist = [10010,10015,10018]
emps = session.query(Employee).filter(Employee.emp_no.in_(emplist))
show(emps)

#5.NOT IN
print('^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^')
emplist = [10010,10015,10018]
emps = session.query(Employee).filter(~Employee.emp_no.in_(emplist))
show(emps)

#6.LIKE
print('!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!')
emps = session.query(Employee).filter(Employee.last_name.like('P%'))
show(emps)

#7.ASC(升序)
print('$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$')
emps = session.query(Employee).filter(Employee.emp_no > 10010).order_by(Employee.emp_no)
show(emps)
print('$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$')
emps = session.query(Employee).filter(Employee.emp_no > 10010).order_by(Employee.emp_no.asc())
show(emps)

#8.DESC(降序)
print('$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$')
emps = session.query(Employee).filter(Employee.emp_no > 10010).order_by(Employee.emp_no.desc())
show(emps)

#9.多列排序
print('$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$')
emps = session.query(Employee).filter(Employee.emp_no > 10010).order_by(Employee.last_name).order_by(Employee.emp_no.desc())
show(emps)

#10.分页
print('***********************************************************')
emps = session.query(Employee).limit(4)
show(emps)
print('***********************************************************')
emps = session.query(Employee).limit(4).offset(18)
show(emps)

#11.消费者方法
#总行数(聚合函数)
print('???????????????????????????????????????????????????????????')
emps = session.query(Employee)
print(len(list(emps)))
print('???????????????????????????????????????????????????????????')
print(emps.count())
#取所有数据
print('???????????????????????????????????????????????????????????')
print(emps.all())
#取一行
# print(emps.one()) #返回一行,如果查询结果为多行则抛异常
print('???????????????????????????????????????????????????????????')
print(emps.limit(1).one())
#删除delete by query
print('???????????????????????????????????????????????????????????')
session.query(Employee).filter(Employee.emp_no > 10018).delete()
# session.commit() #提交则删除

运行结果:

2019-08-04 10:25:26,329 INFO sqlalchemy.engine.base.Engine SHOW VARIABLES LIKE 'sql_mode'
2019-08-04 10:25:26,329 INFO sqlalchemy.engine.base.Engine {}
2019-08-04 10:25:26,331 INFO sqlalchemy.engine.base.Engine SHOW VARIABLES LIKE 'lower_case_table_names'
2019-08-04 10:25:26,331 INFO sqlalchemy.engine.base.Engine {}
2019-08-04 10:25:26,334 INFO sqlalchemy.engine.base.Engine SELECT DATABASE()
2019-08-04 10:25:26,334 INFO sqlalchemy.engine.base.Engine {}
2019-08-04 10:25:26,336 INFO sqlalchemy.engine.base.Engine show collation where `Charset` = 'utf8mb4' and `Collation` = 'utf8mb4_bin'
2019-08-04 10:25:26,337 INFO sqlalchemy.engine.base.Engine {}
2019-08-04 10:25:26,339 INFO sqlalchemy.engine.base.Engine SELECT CAST('test plain returns' AS CHAR(60)) AS anon_1
2019-08-04 10:25:26,339 INFO sqlalchemy.engine.base.Engine {}
2019-08-04 10:25:26,341 INFO sqlalchemy.engine.base.Engine SELECT CAST('test unicode returns' AS CHAR(60)) AS anon_1
2019-08-04 10:25:26,341 INFO sqlalchemy.engine.base.Engine {}
2019-08-04 10:25:26,342 INFO sqlalchemy.engine.base.Engine SELECT CAST('test collated returns' AS CHAR CHARACTER SET utf8mb4) COLLATE utf8mb4_bin AS anon_1
2019-08-04 10:25:26,342 INFO sqlalchemy.engine.base.Engine {}
2019-08-04 10:25:26,344 INFO sqlalchemy.engine.base.Engine DESCRIBE `employees`
2019-08-04 10:25:26,344 INFO sqlalchemy.engine.base.Engine {}
#############################################################
2019-08-04 10:25:26,350 INFO sqlalchemy.engine.base.Engine BEGIN (implicit)
2019-08-04 10:25:26,351 INFO sqlalchemy.engine.base.Engine SELECT employees.emp_no AS employees_emp_no, employees.birth_date AS employees_birth_date, employees.first_name AS employees_first_name, employees.last_name AS employees_last_name, employees.hire_date AS employees_hire_date 
FROM employees 
WHERE employees.emp_no > %(emp_no_1)s
2019-08-04 10:25:26,351 INFO sqlalchemy.engine.base.Engine {'emp_no_1': 10015}
<Employee emp_no:10016 name:Kazuhito.Cappelletti>
<Employee emp_no:10017 name:Cristinel.Bouloucos>
<Employee emp_no:10018 name:Kazuhide.Peha>
<Employee emp_no:10019 name:Lillian.Haddadi>
<Employee emp_no:10020 name:Mayuko.Warwick>


-------------------------------------------------------------
2019-08-04 10:25:26,354 INFO sqlalchemy.engine.base.Engine SELECT employees.emp_no AS employees_emp_no, employees.birth_date AS employees_birth_date, employees.first_name AS employees_first_name, employees.last_name AS employees_last_name, employees.hire_date AS employees_hire_date 
FROM employees 
WHERE employees.emp_no > %(emp_no_1)s AND employees.emp_no < %(emp_no_2)s
2019-08-04 10:25:26,354 INFO sqlalchemy.engine.base.Engine {'emp_no_1': 10015, 'emp_no_2': 10018}
<Employee emp_no:10
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值