数据库——ORM基础

ORM

ORM架构

]

简单来说ORM就是通过实例对象的语法,完成关系型数据库的操作的技术,是"对象-关系映射"的缩写。

ORM把数据库映射成对象

  • 数据库的表 映射为 类
  • 记录映射为对象
  • 字段映射为属性

主要的实现

  1. SqlObject
  2. peewee
  3. Django’s ORM
  4. SQLAlchemy

安装

conda install sqlalchemy

测试

import sqlalchemy
print(sqlalchemy.__version__)
# 1.3.11

模型介绍

常见的数据类型

  • Integer
  • Float
  • Boolean
  • ForeignKey
  • Date/DateTime
  • String
  • 更多的数据类型

使用

定义数据类

from sqlalchemy import Column, Integer, String, DateTime, Boolean
from sqlalchemy.ext.declarative import declarative_base
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)
    create_time = Column(DateTime)
    is_valid = Column(Boolean)

连接mysql

from sqlalchemy import create_engine
engine = create_engine('mysql://user:rootpassword@127.0.0.1/database_name')

创建Session

from sqlalchemy.orm import sessionmaker
Session = sessionmaker(bind=engine)

创建表

 News().metadata.create_all(engine)

增加一条数据

class OrmTest(object):
    def __init__(self):
        self.session = Session()

    # 新增一条记录
    def add_one(self):
        new_obj = News(title='title', content='content', types='1')
        self.session.add(new_obj)
        self.session.commit()
        return new_obj
def main():
    obj = OrmTest()
    rest = obj.add_one()
    print(rest.id)

运行main函数就可以添加数据了。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RqlkLGaV-1577449753747)

此时无法添加中文数据

出现的错误
UnicodeEncodeError: 'charmap' codec can't encode characters in position 0-1: character maps to <undefined>

这是因为数据库的编码问题

解决的方法
engine = create_engine('mysql://user:rootpassword@127.0.0.1/database_name?charset=utf8')

在连接数据库的时候传入参数,采用utf-8编码。此时就可以添加中文数据了。

增加多条数据

增加多条数据可以写多个add()语句,也可以使用add_all()语句来

查询数据

  def get_one(self):
        return self.session.query(News).get(1)
  def get_moew(self):
        return self.session.query(News).filter_by(is_valid=1)

进行查询一条数据或者查询多条数据。

对于一条数据来说

rest = obj.get_one()
if rest:
    print('ID:{0} => {1}'.format(rest.id, rest.title))
else:
    print("Run Error")

对于多条数据

rest = obj.get_more()
print(rest.count())
for new_obj in rest:
    print("ID:{0} => {1}".format(new_obj.id , new_obj.title))

对于得到的数据会得到一个对应的数据库模型相同的对象。

修改数据

   def update_data(self):
        obj = self.session.query(News).get(2)
        if obj:
            obj.is_valid = 0
            self.session.add(obj)
            self.session.commit()
            return True
        else:
            return False

同样对于多条的数据可以通过循环的方式来进行修改。

    def delete_date(self):
        data = self.session.query(News).get(4)
        if data:
            self.session.delete(data)
            self.session.commit()
            return True
        else:
            return False
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值