Python学习之 --- 数据库编程之 ORM+sqlalchemy 库使用

本文介绍了Python中的ORM框架SQLAlchemy的使用,包括安装、创建连接、定义实体类、会话session的创建与数据库操作。详细阐述了查询、修改数据、复杂查询的方法,如隐式内连接、Join、聚合、分组和关联查询。通过示例代码展示了如何在实际开发中利用SQLAlchemy进行高效数据库操作。
摘要由CSDN通过智能技术生成

ORM

ORM,对象关系映射,对象和关系之间的映射,使用面向对象的方式来操作数据库。

关系模型和Python对象之间的映射
table => class ,表映射为类
row => object ,行映射为实例
column => property ,字段映射为属性

SQLAlchemy


SQLAlchemy是一个ORM框架

安装

pip install sqlalchemy

官方文档

(官方文档http://docs.sqlalchemy.org/en/latest/)[http://docs.sqlalchemy.org/en/latest/]

开发使用

SQLAlchemy内部使用了连接池

第一步 :创建连接,创建实体类

dialect+driver://username:password@host:port/database
mysqldb的连接
mysql+mysqldb://<user>:<password>@<host>[:<port>]/<dbname>
engine = sqlalchemy.create_engine("mysql+mysqldb://wayne:wayne@127.0.0.1:3306/magedu")
pymysql的连接
mysql+pymysql://<username>:<password>@<host>/<dbname>[?<options>]
engine = sqlalchemy.create_engine("mysql+pymysql://wayne:wayne@127.0.0.1:3306/magedu")
engine = sqlalchemy.create_engine("mysql+pymysql://wayne:wayne@127.0.0.1:3306/magedu",
echo=True)
echo=True
引擎是否打印执行的语句,调试的时候打开很方便。
lazy connecting:懒连接。创建引擎并不会马上连接数据库,直到让数据库执行任务时才连接。

举例:

import sqlalchemy
from sqlalchemy import create_engine, Column, String, Integer,Enum,Date,ForeignKey # 导入外键
from sqlalchemy.ext.declarative import declarative_base
from  sqlalchemy.orm import sessionmaker,relationships
HOST = '172.22.141.122'
USERNAME = 'eric01'
PASSWORD = 'eric01'
DBNAME = 'test'
PORT = 3306
engine = create_engine("mysql+pymysql://{}:{}@{}:{}/{}".format(USERNAME, PASSWORD, HOST, PORT, DBNAME),
                       echo=True)  # echo  =True ,后期会将语句报保存到日志
print(engine)
# ORM Maping
Base = declarative_base()
class Student(Base):  # 创建表
    __tablename__ = 'student'  # 指定数据库表对应
    id = Column(Integer, primary_key=True, autoincrement=True)  # 字段名一致 不重复写
    # 主键和自增
    name = Column(String(64), nullable=False)
    age = Column(Integer)
    def __repr__(self):
        return "<{} id = {}, name = {},age = {}>" .format(
            __class__.__name__, self.id, self.name,self.age)
# 创建后将不需要在执行下面的语句
# Base.metadata.drop_all(engine)  # 删除base 所管理的所有mapping类
# Base.metadata.create_all(engine)
from sqlalchemy.orm.session import Session
session:Session = sessionmaker(bind = engine)() # 实例化
print(session,type(session))

student  = Student(name= 'tom' )
student.name= 'jerry'
student.age = 20
print( student)
session.add(student) # 将student 加入到session 中
session.commit() #提交
# ##########方法二:
try:
    try:
    session.add_all([student])
    session.commit()
    print(' ~~~~~~~~~~')
except:
    session.rollback()
    print('++++++++++++')
### add_all()方法不会提交成功的,不是因为它不对,而是student,student成功提交后,sudent的主键就有了值,所以,只要student没有修改过,就认为没有改动。如下,student变化了,就可以提交修改了。

生产环境很少这样创建表,都是系统上线的时候由脚本生成。
生产环境很少删除表,宁可废弃都不能删除。

第二步 : 创建会话 session

在一个会话中操作数据库,会话建立在连接上,连接被引擎管理。
当第一次使用数据库时,从引擎维护的连接池中获取一个连接使用。

# 创建session 
Session = sessionmaker(bind = engine)
session = Session() # 实例化

第三步: 数据库操作

1> 查询

students = session.query(Student) # 并没有真的查询,只是返回个查询集,是懒查询
print(students) 
print(students.count())#  可以查询个数,但这是个子查询
for x in students:
    print(x)

2> 改数据

student 
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值