淘先锋技术网

首页 1 2 3 4 5 6 7

ORM简单介绍:

ORM:Object  Relationship  Mapping(模型关系映射)。

平时我们和数据库打交道的话,会使用SQL语句来操作数据库,比如我们建立一个demo表:

CREATE TABLE demo(num int ,ser varchar(20);

发现,就是通过一些SQL语句来操作数据库,并没有面向对象的过程,而我们不论java还是python都是面向对象的编程语言。之前使用SQL操作也能做,但是与我们面向对象的理论不符合。而且为了操作更加方便,使开发人员不用去写过多的SQL语句,出现了ORM。作用就是在关系型数据库和业务实体对象之间做一个映射。简单来说:举个例子,我想创立一个user表,我不需要去写SQL语句,而是创建一个user的类,里面定义好它的属性。然后通过ORM就帮我们实现了从类到表的映射,表就自己创建成功了。可以让我们操作数据库就跟操作对象是一样的。一个表就抽象成一个类,一条数据就抽象成该类的一个对象。

所有的ORM必须具备三方面的能力:映射能力,CRUD操作(增删改查),缓存优化。


Flask sqlalchemy:

flask - sqlalchemy 就是一套ORM框架。

flask - sqlalchemy 的安装:pip  install  flask-sqlalchemy

flask - sqlalchemy 的使用:

     1.初始化和设置数据库配置信息

        我们既然使用sqlalchemy这个ORM框架,那它本身就是一个类,我们使用一个类,就得先创建这个类得对象,然后使用对象来操作吧。所以,

           from flask_sqlalchemy import SQLAlchemy

           db = SQLAlchemy(app)

                    这时候注意,db为Sqlalchemy的对象。而查看SQlalchemy的官方文档,我们发现它创建对象的时候需要传递一个flask 的应用对象app进去。如图:两种传参方式。

  

          初始化完成后,我们还需要配置数据库,就是告诉这个ORM对象db链接哪个数据库:

                     SQLAlchemy 把一个引擎的源表示为一个连同设定引擎选项的可选字符串参数的 URI。URI 的形式是:

                      dialect+driver://username:password@host:port/database

                     而且框架规定URI的名字必须统一,就是SQLALCHEMY_DATABASE_URI,整体格式如下:

            SQLALCHEMY_DATABASE_URI =  dialect+driver://username:password@host:port/database

                    我使用的是postgreSQL数据库,配置信息都写在一个叫config.py文件中,链接信息填写如下:

HOSTNAME = '127.0.0.1'
PORT = '5432'
DATABASE = 'xxxx'
USERNAME = 'xxxxxxx'
PASSWORD = 'xxxxxxxxxxxx'
DB_URI = 'postgresql+psycopg2://{}:{}@{}:{}/{}'.format(USERNAME,PASSWORD,HOSTNAME,PORT,DATABASE)
SQLALCHEMY_DATABASE_URI = DB_URI

然后在我们的主文件中:

import config

from flask_sqlalchemy import SQLAlchemy

 

app = Flask(__name__)

app.config.from_object(config)

db = SQLAlchemy(app)
 

这样呢就完成了数据库的初始化和配置。

 

              2.模型与表的映射

之前讲了,我们一张表对应的就是一个类,而我们创建一个类之后,框架需要知道我们创建的这个类就是要用来映射成表的,那么就得给这个类传入一个参数,告诉框架,这是模型类:比如我创建一个用户表,那就得把SQLAlchemy里面的model属性传入:如下

class User(db.Model):
    __tablename__='user'  #表名设置为user
    id = db.Column(db.Integer,primary_key=True,autoincrement=True)   #id属性 对应的就是表中的id这一项
    telephone = db.Column(db.String(11),nullable=False)           #只要这个属性要映射到数据库中,就是db.Column()类型
    username = db.Column(db.String(50),nullable=False)               
    password = db.Column(db.String(100),nullable=False)              

3.增删改啥操作

我们有了user这个类,那么一条数据对应的就是一个对象。假设我们已经从前端获取了用户输入的注册数据:

mytelephone = request.form.get('telephone')
myusername = request.form.get('username')
mypassword1 = request.form.get('password')

然后我们创建一个User类的对象,把参数传入。

user = User(telephone=mytelephone, username=myusername, password=mypassword)

要在sqlalchemy这个框架中使用增删改查,那么就要使用它自己内部的一个属性:session(这个和全局的那个session/cookie没关系,)如下:

db.session.add(user)   #使用sqlalchemy的对象db来操作sqlalchemy,使用sqlalchemy里面的session中的add方法添加。

而且我们对数据库的操作都属于事务,不明白的可以自行百度。所以我们写完db.session.add(user)后,如果没有提交的话,代码是不会执行的。所以要提交事务:

db.session.commit()

这样完了之后,我们才会在数据库中添加了这条数据。其他的删改查类似。就不一 一列举了。