【python】ORM

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))



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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值