ORM 全称ORM 将数据库中的表与面向对象语言中的类建立了一种对应关系。这样,我们要操作数据库,数据库中的表或者表中的一条记录就可以直接通过操作类或者类实例来完成。
SQLAlchemy 是Python 社区最知名的mysql、Oracle等
安装:
pip3 install sqlalchemy
使用步骤:
l 建立数据库连接
l 描述表结构(如果表不存在则会新建表)
l 得到数据库操作游标(会话session)
l 操作数据表,提供了两种方法,分别为原生SQL语句操作(execute)和类方式操作
通过原生SQL语句操作
1 #导入必要模块
2 from sqlalchemy import create_engine
3
4 #得到连接对象
5 #参数:mysql+pymysql://用户名:密码@地址/数据库名
6 #添加参数 echo=True 表示打印日志到控制台
7 connal = create_engine("mysql+pymysql://root2:proot2@192.168.1.175/dongdb",encoding='utf-8')
8
9 #查询
10 resselect=connal.execute("select * from tb_dong")
11 print(resselect.rowcount) #输出查询到的值
12 print(resselect.fetchall()) #输出列表数据
13
14 #插入,输出影响行数
15 resinsert=connal.execute("insert into tb_dong(namex,sex) values('%s','%s')"%("东小东xx","F")).rowcount
16 print(resinsert)
类方式操作
描述表结构时:
设置为主键【primary_key=True】、
是否可为空【nullable=False】、
外键【ForeignKey(“另一个表名.字段名”)】 #表名与字段名的点不可去掉
1 #导入必要模块
2 import sqlalchemy
3 from sqlalchemy import create_engine
4 from sqlalchemy.ext.declarative import declarative_base
5 from sqlalchemy import Column, Integer, String
6 from sqlalchemy.orm import sessionmaker
7
8
9 #-------------得到连接对象--------------------
10 #参数:mysql+pymysql://用户名:密码@地址/数据库名
11 #添加参数 echo=True 表示打印日志到控制台
12 connal = create_engine("mysql+pymysql://root2:proot2@192.168.1.175/dongdb",
13 encoding='utf-8')
14
15 #----------------创建表,描述表结构-----------------------
16 #得到基类
17 classal = declarative_base()
18 class tb_dong3(classal):
19 __tablename__ = "tb_dong3" # 表名为 tb_dong3
20 id = Column(Integer, primary_key=True) # 设置列为主键,默认不可为空且自增
21 name = Column(String(15))
22 password = Column(String(15))
23
24 def __repr__(self):
25 return "<id=%s ; name=%s ; password=%s>"%(self.id,self.name,self.password)
26
27 #提交创建表命令
28 classal.metadata.create_all(connal)
29
30 #------------------ 游标获取 ------------------
31
32 #得到数据库游标
33 cousession=sessionmaker(bind=connal)()
34
35 #--------------------插入数据------------------
36 #设置要插入的数据
37 dataobj1=tb_dong3(name="dong",password="dongpp东1")
38 dataobj2=tb_dong3(name="dong",password="dongpp东2")
39
40 #添加数据,参数可为列表:add([dataobj1, dataobj1])
41 cousession.add(dataobj1)
42 cousession.add(dataobj2)
43
44 #提交数据
45 cousession.commit()
46
47 #--------------------查询数据---------------------
48 #filter(tb_dong3.id>1)为条件查询
49 #多条件查询可以使用多个 filter 拼接
50 #查询所有:all() 查询一个:first() 计数:count()
51 resdata=cousession.query(tb_dong3).filter(tb_dong3.id>0).filter(tb_dong3.name=="dong").all() #查询所有
52 print(resdata) #输出全部查询结果
53 #print(cousession.query(tb_dong3).filter(tb_dong3.id>0).filter(tb_dong3.name=="dong").count()) #查询所有
54 print(len(resdata)) #得到查询结果的数量,相当于上面一句
55 print(resdata[0].name) #取出name值
56
57 #----------------- 更新--------------------------
58 #先查询,然后赋值,然后提交
59 resupdate=cousession.query(tb_dong3).filter(tb_dong3.id==3).first()
60 resupdate.name="ddddddddd"
61 resupdate.password="xxxxxx"
62 cousession.commit()
63
64 #------------------- 删除 -----------------------
65 resdel=cousession.query(tb_dong3).filter(tb_dong3.id==73).first()
66 cousession.delete(resdel)
67 cousession.commit()
连表操作:
重点在于需要描述两张表
1 #导入必要模块
2 from sqlalchemy import create_engine
3 from sqlalchemy.ext.declarative import declarative_base
4 from sqlalchemy import Column, Integer, String
5 from sqlalchemy.orm import sessionmaker
6
7
8 #-------------得到连接对象--------------------
9 #参数:mysql+pymysql://用户名:密码@地址/数据库名
10 #添加参数 echo=True 表示打印日志到控制台
11 connal = create_engine("mysql+pymysql://root2:proot2@192.168.1.175/dongdb",
12 encoding='utf-8')
13
14 #----------------创建表,描述表结构-----------------------
15 #得到基类
16 classal = declarative_base()
17 #建立tb_dong3表描述
18 class tb_dong3(classal):
19 __tablename__ = "tb_dong3" # 表名为 tb_dong3
20 id = Column(Integer, primary_key=True) # 设置列为主键,默认不可为空且自增
21 name = Column(String(15))
22 password = Column(String(15))
23
24 def __repr__(self):
25 return "<id=%s ; name=%s ; password=%s>"%(self.id,self.name,self.password)
26
27 #建立tb_dong2表描述
28 class tb_dong2(classal):
29 __tablename__ = "tb_dong2" # 表名为 tb_dong3
30 id = Column(Integer, primary_key=True) # 设置列为主键,默认不可为空且自增
31 name = Column(String(10))
32 sex = Column(String(1))
33
34 def __repr__(self):
35 return "<id=%s ; name=%s ; sex=%s>"%(self.id,self.name,self.sex)
36
37 #提交创建表命令
38 classal.metadata.create_all(connal)
39
40 #------------------ 游标获取 ------------------
41
42 #得到数据库游标
43 cousession=sessionmaker(bind=connal)()
44
45 #-------------------- 连表查询 ---------------------
46 #tb_dong3.name==tb_dong2.name 两表的name字段值相等
47 #得到单表数据(tb_dong2)
48 #resdata=cousession.query(tb_dong2).filter(tb_dong3.id>0).filter(tb_dong3.name==tb_dong2.name).all()
49 #输出两张表的数据(tb_dong2,tb_dong3)
50 resdata=cousession.query(tb_dong2,tb_dong3).filter(tb_dong3.id>0).filter(tb_dong3.name==tb_dong2.name).all()
51 print(resdata) #输出全部查询结果
52 print(len(resdata)) #得到查询结果的数量,相当于上面一句
53 print(resdata[0][0].name) #取出name值