ORM
ORM架构
]
简单来说ORM就是通过实例对象的语法,完成关系型数据库的操作的技术,是"对象-关系映射"的缩写。
ORM把数据库映射成对象
- 数据库的表 映射为 类
- 记录映射为对象
- 字段映射为属性
主要的实现
- SqlObject
- peewee
- Django’s ORM
- 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函数就可以添加数据了。
此时无法添加中文数据
出现的错误
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