zoukankan      html  css  js  c++  java
  • Flask web开发之路七

    今天写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()
    ```

    人生苦短,何不用python
  • 相关阅读:
    日报 18/07/10
    meta标签
    map 和 vector 的erase函数说明
    Intel CPU MMX SSE SSE2/3/4指令集手册下载URL
    关于c中 int, float, double转换中存在的精度损失问题
    c++ 常数后缀说明
    STL中容器的push()或者push_back()函数的一点说明
    fprintf, fscanf,printf,scanf使用时参数注意
    操作系统 庞丽萍 第七章
    辨析全局变量的声明与定义
  • 原文地址:https://www.cnblogs.com/yqpy/p/8655158.html
Copyright © 2011-2022 走看看