初学ORM 工具之 SQLAlchemy 操作MySQL,结果混淆了sessionmaker和它的实例。
sessionmaker需要先绑定engine,然后实例化一个session,这个session才可以用于CURD。
使用orm插入数据
# SQLAlchemy如何创建表并增加一条记录 第一步先导入模块
from sqlalchemy import create_engine # sqlalchemy的引擎
from sqlalchemy import Column,String,Integer # 字段类,字符串类和整形
from sqlalchemy.orm import sessionmaker # 预配置范围的会话(session),代替connect执行数据库操作
from sqlalchemy.ext.declarative import declarative_base # 用于创建数据库中表的基类
#第二步构造基类
Base=declarative_base() #构造基类
#第三步构造一个表
class math(Base):#必须继承declaraive_base得到的基类
__tablename__ = "math" #用__tablename__来指定这个类对应什么表,如果这个表在库中不存在,SQLAlchemy会帮我们创建
id=Column(String(20),primary_key=True) #Column类创建一个字段
name=Column(String(50))
ms=Column(Integer)
#第四步建立与数据库的连接
if __name__=='__main__':
engine=create_engine('mysql+mysqlconnector://root:65578466578@127.0.0.1:3306/score') #建立数据库连接
DBSession=sessionmaker(bind=engine) # 实例化 sessionmaker,绑定engine
Session=DBSession() #实例化了一个会话(或叫事务),之后的所有操作都是基于这个对象的
#第五步创建数据并加入其中
liuzhishan = math(id='001',name="lzs",ms=100)
zhangsan = math(id='002',name="张三",ms=90)
Session.add(liuzhishan) # 增加一条记录
Session.add(zhangsan) # 增加一条记录
#第六步提交数据和关闭数据库
Session.commit() # 一定记得提交
Session.close
也可以多条数据直接插入
在插入数据过后,反复的插入相同的数据必然会报错,可以加上try语句
#多条语句的插入:是列表形式 add_all()方法 []括起来
#User为表格的类名,使用类名进行插入,后面的id、name、ms、为字段名,插入数据只需要直接赋值就好了。
try:
Session.add.all([
User(id='001',name='lzs',ms=100),
user(id='002',name="张三",ms=90)
])
Session.commit()
except:
print("已经提交过了,不必反复提交")
Session.rollback()
使用orm查询数据
- 查询数据
from sqlalchemy import Column,String,Integer,create_engine
from sqlalchemy.orm import sessionmaker
from sqlalchemy.ext.declarative import declarative_base
base=declarative_base()
class math(base):
__tablename__="math"
id=Column(String(20),primary_key=True)
name=Column(String(20))
ms=Column(Integer)
engine=create_engine("mysql+mysqlconnector://root:453567463@localhost:3306/score")
Session = sessionmaker(bind=engine) #构造连接Python与mysql
session = Session()
x = session.query(math.id,math.name,math.ms).all() #query意思是查询,all代表所有的数据,frist代表第一条
#all()代表所有数据,返回的是个列表[],frist()代表第一条数据,返回的是个元祖()
print(x)
for i in x:
print(i)
session.close()
输出结果:
[('001', 'lzs', 100), ('002', '张三', 90)]
('001', 'lzs', 100)
('002', '张三', 90)
最后也可以这样写:
x = session.query(User).all() #query意思是查询,User为表格的类名,all()代表所有的数据,frist()代表第一条
#all()代表所有数据,返回的是个列表[],frist()代表第一条数据,返回的是个元祖()
#print(x) 此时x是个表格math
for i in x:
print(i.name,i.id) #name id为表格中的字段名
session.close()
输出结果:
001 lzs
002 张三
- 查询单条数据:
使用 .get()方法 、使用主键查询 只支持主键查询 这里的 1 是指表中主键的一个值:
查不到数据时,返回None,加上判断查不到时,会报错。
x=session.query(User).get(1)
if x:
print(x.name)
else:
print("暂无数据")
- 条件查询:
x=session.query(User).filter_by(name="张三")
print(x)
for i in x:
print(i)
修改数据:
修改数据: 注意使用 .get() 方法只能去找主键
首先使用 .get()获取到数据,然后直接使用 . 加字段名的方法修改
x=session.query(User).get(2)
print(x.name)
x.name="李四"
session.commit
session.close
删除数据
删除数据 首先要拿到数据,然后使用session.delete(数据)删除
x=session.query(User).get(2)
session.delete(x) #删除主键编号为2的一条数据
y=session.query(User).all()
#查看所有的字段:是否已经删除
for i in y:
print(i.name)
session.commit()
session.close()
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/61410.html