ORM Object Relational Mapping,对象关系映射
ORM是建立在SQL语言构造器之上的工具集,用于将Python对象映射到数据库的行,提供了一系列接口用于从数据库中存取对象(行)。在ORM 工作时,在底层调用SQL语言构造器的API,这些通用的操作有些许的不同。不同的是,你不再使用行,而是使用自定义类的对象来操作。另外,数据库的查询 方式也不同,ORM的可以生成大多数的SQL查询,除此之外还可以在类中定义更多操作
主要实现:
1,SqlObject
2,peewee
3,Django's ORM
4,SQLAlchemy
SQLAlchemy安装配置
下载地址:https://pypi.org/project/SQLAlchemy/#files
或者可以采用pip install sqlalchemy命令安装
下载后解压到文件夹
cmd进入python,
测试:>>>import sqlalchemy
>>>sqlalchemy.__version__
1.2.1 (显示的是对应的安装版本)
新建ORM模型
from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base #orm中的一个基类
from sqlalchemy import Column, Integer, String, DateTime, Boolean
engine = create_engine("mysql://root:@127.0.0.1:3306/news_test")
#SQLAlchemy在中首先通过declarative_base申明一个基类。这个基类维持着类与数据库表的关系
Base = declarative_base() #继承这个基类#声明表第一种方式:在自定义类继承declarative_base这个基类来映射数据表
class News(Base):
''' 新闻类型 '''
__tablename__ = 'news'
id = Column(Integer, primary_key=True)
title = Column(String(200), nullable=False)
content = Column(String(2000), nullable=False)
types = Column(String(10), nullable=False)
image = Column(String(300))
author = Column(String(20))
view_count = Column(Integer)
created_at = Column(DateTime)
is_valid = Column(Boolean)
MetaData是一个注册表包括能够一组执行的命令到数据库,上面声明了表的类,但是数据库中并没有创建表,
通过>>>Base.metadata.create_all(engine)向数据库发出建表完成类与表的映射
通过ORM新增数据到数据库
from sqlalchemy.orm import sessionmaker #引入session
Session = sessionmaker(bind=engine)
class MysqlOrmTest(object):
def __init__(self):
self.session = Session()
def add_one(self):
''' 添加数据 '''
new_obj = News(
#中文需要编码,加utf8
title='ORM标题',
content='内容',
types="百家"
)
new_obj2 = News(
#中文需要编码,加utf8
title='ORM标题2',
content='内容2',
types="百家2"
)
self.session.add(new_obj)
self.session.add(new_obj2) #也可以add_all一个list
self.session.commit()
return new_obj
def main():
obj = MysqlSearch()
# rest = obj.get_one()
# print(rest['title'])
rest = obj.add_one()
print(rest)
if __name__ == '__main__':
main()
通过ORM查询数据
class中:
def get_one(self):
''' 获取一条数据 '''
return self.session.query(News).get(13)
def get_more(self):
''' 获取多条数据 '''
return self.session.query(News).filter_by(is_valid=1) #is_valid = True也可以
main()中:
print(obj.get_more().count())
for row in obj.get_more():
print('ID:{0}=>{1}'.format(row.id,row.title))
通过ORM修改和删除数据
class中:
def update_data(self,pk):
''' 修改数据 '''
#修改多条数据
data_list = self.session.query(News).filter_by(is_valid=1) #修改多条数据,用list先保存起来
# data_list = self.session.query(News).filter(News.id >= 5) #修改多条数据,用list先保存起来
for item in data_list:
item.is_valid = 1
self.session.add(item)
self.session.commit()
#修改单条数据
# new_obj = self.session.query(News).get(pk) #将要修改的对象查询出来,若修改多条,则需要加入循环,用list查
# if new_obj:
# new_obj.is_valid = 0
# self.session.add(new_obj)
# self.session.commit()
# return True
# return False
def delete_data(self,pk):
''' 删除数据 123'''
# 获取要删除的数据
data = self.session.query(News).get(pk)
self.session.delete(data) #也是单条数据操作
self.session.commit()
main()中:
print(obj.update_data(3)) #修改第三条记录
print(obj.delete_data(1))