Flask web开发之路七

摘要:
###使用Flask SQLAlchemy创建模型和表之间的映射:1。模型需要从“db”继承。Model”,然后需要映射到表中的属性,该属性必须写入为“db”的数据类型。列“*`Nullable”:指示此字段是否可以为空。默认情况下可以为空。您可以将此值设置为“False”。在数据库中,此值不能为空。

今天写SQLAlchemy数据库 

首先介绍ORM的概念:

ORM,Object类,Relationship:关系,Mapping:映射,也就是模型关系映射

flask-sqlalchemy是一套ORM框架

ORM的好处:可以让我们操作数据库跟操作对象一样,非常方便,因为一个表就抽象成一个类,一条数据就抽象成该类的一个对象;把高层的面向对象操作转换成低层的数据库指令

### Flask-SQLAlchemy的使用:
1. 初始化和设置数据库配置信息:
* 使用flask_sqlalchemy中的SQLAlchemy进行初始化:
```
from flask_sqlalchemy import SQLAlchemy
app = Flask(__name__)
db = SQLAlchemy(app)
```
2. 设置配置信息:在`config.py`文件中添加以下配置信息:
```
# dialect+driver://username:password@host:port/database
DIALECT = '数据库类型'
DRIVER = 'pymysql'(python2.7是mysqldb)
USERNAME = '用户名'
PASSWORD = '密码'
HOST = '127.0.0.1'
PORT = '3306'
DATABASE = '数据库名称'

SQLALCHEMY_DATABASE_URI = "{}+{}://{}:{}@{}:{}/{}?charset=utf8".format(DIALECT,DRIVER,USERNAME,PASSWORD,HOST
,PORT,DATABASE)

SQLALCHEMY_TRACK_MODIFICATIONS = False
```

3. 在主`app`文件中,添加配置文件:
```
app = Flask(__name__)
app.config.from_object(config)
db = SQLAlchemy(app)
```
4. 做测试,看有没有问题:
```
db.create_all()
```
如果没有报错,说明配置没有问题,如果有错误,可以根据错误进行修改。

### 使用Flask-SQLAlchemy创建模型与表的映射:
1. 模型需要继承自`db.Model`,然后需要映射到表中的属性,必须写成`db.Column`的数据类型。
2. 数据类型:
* 'db.Integer'代表的是整形.
* 'db.String'代表的是'varchar',需要指定最长的长度。
* `db.Text`代表的是`text`。
3. 其他参数:
* `primary_key`:代表的是将这个字段设置为主键。
* `autoincrement`:代表的是这个主键为自增长的。
* `nullable`:代表的是这个字段是否可以为空,默认可以为空,可以将这个值设置为`False`,在数据库中,这个值就不能为空了。
4. 最后需要调用`db.create_all`来将模型真正的创建到数据库中。

数据库的增删改查:

主app文件代码如下:

from flask import Flask
from flask_sqlalchemy import SQLAlchemy
import config

app = Flask(__name__)
app.config.from_object(config)

db = SQLAlchemy(app)

# article表:
# create table article(
#     id int primary key autoincrement,
#     title varchar(100) not null,
#     content text not null,
# )
class Article(db.Model):
    __tablename__ = 'article'
    id = db.Column(db.Integer,primary_key=True,autoincrement=True)
    title = db.Column(db.String(100),nullable=False)
    content = db.Column(db.Text,nullable=False)

db.create_all()

@app.route('/')
def hello_world():
    # #增加:
    article1 = Article(title='aaa',content='bbb')
    db.session.add(article1)
    #事务
    db.session.commit()

    # #查
    # # select * from article where title='aaa';
    # result = Article.query.filter(Article.title =='aaa').all()
    # article1 = result[0]
    # print(article1.title,article1.content)

    # #改:
    # #1.先把你要更改的数据查找出来
    # article1 = Article.query.filter(Article.title == 'aaa').first()
    # #2.把这条数据,按你需要的地方进行修改
    # article1.title = 'new title'
    # #3.做事务的提交
    # db.session.commit()

    # #删:
    # #1.把需要删除的数据查找出来
    # article1 = Article.query.filter(Article.content == 'bbb').first()
    # #2.把这条数据删除掉
    # db.session.delete(article1)
    # #3.做事务提交
    # db.session.commit()



    return 'Hello World!'


if __name__ == '__main__':
    app.run()

### Flask-SQLAlchemy数据的增、删、改、查:
1. 增:
```
# 增加:
article1 = Article(title='aaa',content='bbb')
db.session.add(article1)
# 事务
db.session.commit()
```

注意,这里数据库的操作都在主视图函数里执行,因此只有在打开网页的情况下,数据库的操作才能被执行

2. 查:
```
# 查
# select * from article where article.title='aaa';
article1 = Article.query.filter(Article.title == 'aaa').first()
print 'title:%s' % article1.title
print 'content:%s' % article1.content
```
3. 改:
```
# 改:
# 1. 先把你要更改的数据查找出来
article1 = Article.query.filter(Article.title == 'aaa').first()
# 2. 把这条数据,你需要修改的地方进行修改
article1.title = 'new title'
# 3. 做事务的提交
db.session.commit()
```
4. 删:
```
# 删
# 1. 把需要删除的数据查找出来
article1 = Article.query.filter(Article.content == 'bbb').first()
# 2. 把这条数据删除掉
db.session.delete(article1)
# 3. 做事务提交
db.session.commit()
```

免责声明:文章转载自《Flask web开发之路七》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇如何利用添加伪元素的办法自定义checkbox以及radio选框的样式QML-StackView下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

JPA学习(二、JPA_基本注解)

框架学习之JPA(二)JPA是Java Persistence API的简称,中文名Java持久层API,是JDK 5.0注解或XML描述对象-关系表的映射关系,并将运行期的实体对象持久化到数据库中。 Sun引入新的JPA ORM规范出于两个原因:其一,简化现有Java EE和Java SE应用开发工作;其二,Sun希望整合ORM技术,实现天下归一。 学习...

KBEngine源码:组件方案

相对于skynet,KBEngine提供了完整的组件方案。 Loginapp 登录验证、注册、Client的接入口。 Baseapp 通过Loginapp分配过来的Client会与Baseapp保持连接,完成客户端与服务端的交互。 定时把Entity的数据保存进数据库。 Baseapp之间会进行互相备份,保证数据的安全。 灾难恢复-当Baseapp发生问...

三、搞定Service接口和实现类

1.建包com.myz.service.interfaces,用于存放接口,包com.myz.service.imps,用于存放实现类 2.包com.myz.service.interfaces下新建接口EmployeeServiceInterface packagecom.myz.service.interfaces; importjava.io.Se...

'or'='or'经典漏洞原理分析

  'or'='or'漏洞是一个比较老的漏洞了,主要是出现在后台登录上,利用这个漏洞,我们可以不用输入密码就直接进入系统的后台。它出现的原因是在编程时逻辑上考虑不周,同时对单引号没有进行过滤,从而导致了漏洞的出现。先给大家简单介绍下漏洞的原理吧,只要大家搞懂了原理,就可以自己去找这样漏洞的系统了。 1:语句:''or'='or'    a'or'1=1...

项目实战6—Mysql实现企业级日志管理、备份与恢复实战

Mysql实现企业级日志管理、备份与恢复实战   环境背景:随着业务的发展,公司业务和规模不断扩大,网站积累了大量的用户信息和数据,对于一家互联网公司来说,用户和业务数据是根基。一旦公司的数据错乱或者丢失,对于互联网公司而言就等于说是灭顶之灾,为防止系统出现操作失误或系统故障导致数据丢失,公司要求加强用户数据的可靠性,要求全面加强数据层面备份,并能在故障...

Windows Server 2008 R2 实现多用户同时登陆

Windows Server 2008 R2远程用户数设置 在windows server 2008 R2里面,默认的远程桌面连接数为1。这对我们的服务器管理带来了很大的不便,那么怎样来修改2008 r2的远程桌面连接数呢。 网上好多转的文章都一样,而且根本就不是Windows Server 2008 R2。 正确的方法如下: 1 开始-管理工具-远程桌...