Flask ==> Migrate

本文详细介绍使用Flask框架结合SQLAlchemy进行数据库操作的过程,包括配置数据库连接、创建数据模型、执行增删改查等基本操作,以及如何利用Flask-Migrate进行数据库迁移。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Flask  ==>   Migrate

1.结构图

 

2.一般流程。

#!/usr/bin/env python
# -*- coding:utf-8 -*-
from flask import Flask

from auth.auth import Auth
from flask_session import Session

# 1. 引入Flask-SQLAlchemy
from flask_sqlalchemy import SQLAlchemy
db = SQLAlchemy()


from .views.account import account
from .views.main import main
from .views.user import user

# 3. 导入models中的表
from .models import *


def create_app():
    app = Flask(__name__)
    app.debug = True
    app.secret_key = 'sdiusdfsdf'
    # 设置配置文件
    app.config.from_object('settings.DevelopmentConfig')

    # 注册蓝图
    app.register_blueprint(account)
    app.register_blueprint(user)
    app.register_blueprint(main)

    # 注册组件
    # Session(app)
    Auth(app)

    # 2. 注册 Flask-SQLAlchemy
    # 这个对象在其他地方想要使用
    # SQLAlchemy(app)
    db.init_app(app)

    return app
manage.py
#!/usr/bin/env python
# -*- coding:utf-8 -*-
from flask import Flask

from auth.auth import Auth
from flask_session import Session

# 1. 引入Flask-SQLAlchemy
from flask_sqlalchemy import SQLAlchemy
db = SQLAlchemy()


from .views.account import account
from .views.main import main
from .views.user import user

# 3. 导入models中的表
from .models import *


def create_app():
    app = Flask(__name__)
    app.debug = True
    app.secret_key = 'sdiusdfsdf'
    # 设置配置文件
    app.config.from_object('settings.DevelopmentConfig')

    # 注册蓝图
    app.register_blueprint(account)
    app.register_blueprint(user)
    app.register_blueprint(main)

    # 注册组件
    # Session(app)
    Auth(app)

    # 2. 注册 Flask-SQLAlchemy
    # 这个对象在其他地方想要使用
    # SQLAlchemy(app)
    db.init_app(app)

    return app
init.py

init.py 在 manage.py 里的 create_app 跳入之后的。

1.先处理app。

# 1. 引入Flask-SQLAlchemy
from flask_sqlalchemy import SQLAlchemy   #导入SQLALchemy
db = SQLAlchemy()  #实例化SQALchemy对象

ps:  这个 db(sqlalchemy)对象就和session也一样,可以创建个对象。 session里面有个 __init__ 方法,里面含有各种方法。

  

 2.注册 Flask-SQLAlchemy。

运用类似session的__intit__ 引入传参数,然后在执行。

# 1. 引入Flask-SQLAlchemy
from flask_sqlalchemy import SQLAlchemy   #导入SQLALchemy
db = SQLAlchemy(app)  #实例化SQALchemy对象。   db= SQLALchemy(参数)   可以传个app参数
# 2. 注册 Flask-SQLAlchemy
# 这个对象在其他地方想要使用
# SQLAlchemy(app)
db.init_app(app)   #执行

 

3.导入models表。

# 3. 导入models中的表
from .models import *

 

4.写类继承db.Model。

ps: 正经:  原来我们写的继承Base。

  不正经: 一下这种方式,饶了一圈。本质和Base一样的。

 

5.主要功能: 创建,修改表等等功能。 中间有一步: 定制命令,  manager=Manager(app)

 

 

5.1:导入:from flask_migrate import Migrate, MigrateCommand

from app import create_app, db

 

 

5.2 创建migrate 示例

 

5.3  创建db命令

 

 连接数据库用配置文件init里的文件执行 。我们用了flask组件,以后就去配置文件里写就好了。

 只要把 sqlalchemy 的参数拿到配置文件里就好了。

1.拿配置文件

 

setting.py:

 

 最后连上数据库:

    3.Flask_migrate    : 类似django的  python manage.py db migrate   =  python  manage.py makemigrations
                                       python manage.py db upgrade   = python  manage,py migrate

 

 二: 操作数据库

 1. 对数据库做操作需要有session。有了session才能做操作。那么 session从哪来呢?

  回答:  db.session  它会自动帮我们创建session。  它是  flask里的 sqlalchemy 的对象里面的session。

  以前我们会的session两种:

    1.  线程安全

    2. 手动创建

  

 

 

 

后面两步:要 commit  和  remove

  执行sql  方式:

  1.第一种方式:

  

        方式一:
            result = db.session.query(models.User.id,models.User.name).all()
            db.session.remove()

 

 

  2.第二种方式:

        方式二:
            result = models.Users.query.all()   #局限于自己那张表

 

 

flask回顾:用了哪些插件

   Flask  

  DButils  : 针对原生sql的时候用的。 之后如果需要用 sqlalchemy  那么我们就只好二选一了。 也可都用,但是最好不要这样。

  Flask-session:

  Flask-Script:

  Flask-Migrate:

  Flask-SQLAIchemy:

  blinker:

  wtforms:

 

requirements.txt:

pip3  freeze  
pip3 freeze > requirements.txt

 获取环境中所有安装的模块。

 

 # pip3 install pipreqs
 # 获取当前所在程序目录中涉及到的所有模块,并自动生成 requirements.txt 且写入内容。

 pipreqs ./
 # 写程序路径, 我们需要找谁,它会帮我们找到



进入程序目录:
pip3 install -r requirements.txt

 

转载于:https://www.cnblogs.com/zhongbokun/p/8279125.html

<think>好的,我现在需要帮助用户了解如何用Flash模拟EEPROM实现按字写入的功能。首先,我需要回忆一下Flash和EEPROM的区别,因为用户提到了这两个存储器的差异。根据用户提供的引用[2],Flash和EEPROM在擦写单位、寿命等方面有所不同。Flash通常以页为单位擦除,而EEPROM可以按字节擦写,寿命也更长。 用户的问题是如何实现按字节写入,而Flash的擦除单位是页,这中间存在矛盾。所以,我需要找到一种方法,让Flash能够模拟EEPROM的按字节写入。常见的策略应该是使用页管理,比如采用类似磨损均衡的方法,或者使用多个页轮转存储,避免频繁擦除同一页。 接下来,我需要考虑具体的实现步骤。首先,可能需要将Flash分成若干页,每页大小和Flash的页大小一致,比如1KB或4KB。然后,当需要写入数据时,先检查该地址是否已经被写过,如果是,则标记旧数据无效,写入新数据到当前页的空闲位置。当页满时,进行页擦除,并将有效数据迁移到新页。 但是用户提到的是按字写入,也就是单字(比如32位)的写入。这里可能需要更细致的处理。例如,每个写入操作需要记录地址和数据,同时管理这些记录的位置。此外,写入前可能需要检查该地址是否已经存在有效数据,如果有,则需处理旧数据。 另外,需要考虑Flash的写入特性。Flash写入只能将位从1变为0,不能从0变回1,除非擦除整个页。因此,在写入数据时,需要确保目标位置已经被擦除(全为1),或者通过位操作来适应这种特性。不过,按字节写入的话,可能需要将整个字的位置准备好,可能需要额外的逻辑来处理。 然后,我需要参考用户提供的引用[1]和[2]。引用[1]提到APM32F4的Flash模拟EEPROM的代码实现,可能涉及到如何分页、如何管理写入和擦除。引用[2]提到报警器项目中使用内部Flash代替EEPROM,因为配置参数不需要频繁擦写,适合Flash的寿命。这可能意味着在实现时,需要尽量减少擦除次数,通过页轮转或类似方法延长Flash寿命。 接下来,我需要将这些思路整理成具体的步骤。例如,分页管理、写入时的查找和替换、页切换和擦除等。同时,代码示例部分需要展示如何实现按字写入,可能需要使用特定的函数来写入Flash,并处理地址映射。 在实现过程中,可能遇到的问题包括:如何高效地查找可用空间,如何处理多个数据版本,如何确保在断电时数据不丢失等。需要确保每个步骤都考虑到这些因素,并在代码中进行适当的处理,比如使用校验和或备份机制。 最后,生成相关问题,帮助用户进一步了解该主题,比如如何优化擦除次数,如何处理数据一致性等。确保问题覆盖用户可能感兴趣的扩展方向。</think>### 使用Flash模拟EEPROM实现按字写入的方法 #### 1. 基本原理与差异分析 Flash与EEPROM的核心差异在于擦写单位和寿命: - **Flash**:以页为单位擦除(例如1KB/4KB),擦写寿命约1万次[^2] - **EEPROM**:支持字节级擦写,寿命约10万次以上[^2] 因此模拟实现需要解决两个关键问题: 1. 如何将字节/字操作转换为页级操作 2. 如何延长Flash使用寿命 #### 2. 实现步骤(以32位字写入为例) **步骤1:存储结构设计** ```c #define PAGE_SIZE 2048 // Flash页大小 #define WORD_SIZE 4 // 32位字 typedef struct { uint32_t addr; uint32_t data; uint32_t crc; // 校验位 } FlashWord; ``` **步骤2:页管理策略** - 使用双页轮换机制(Page0/Page1) - 每个存储单元包含地址、数据、校验三部分 - 当前页写满后触发页迁移 **步骤3:写入流程图解 ``` 写入请求 → 查找空闲位置 → 写入新数据 → 更新索引表 → 若页满则触发迁移 ``` #### 3. 关键代码实现 ```c // 查找最新有效数据 bool find_latest_word(uint32_t addr, uint32_t *result) { FlashWord *p = (FlashWord*)ACTIVE_PAGE_BASE; uint32_t latest_crc = 0; for(int i=0; i<PAGE_SIZE/sizeof(FlashWord); i++){ if(p[i].addr == addr && crc32_check(p[i].crc)) { *result = p[i].data; return true; } } return false; } // 写入单个字 void write_word(uint32_t addr, uint32_t data) { FlashWord new_entry; new_entry.addr = addr; new_entry.data = data; new_entry.crc = crc32_generate(data); // 写入Flash(需确保目标区域已擦除) flash_program(ACTIVE_PAGE_OFFSET, &new_entry, sizeof(FlashWord)); // 检查页使用率 if(++write_count >= MAX_WORDS_PER_PAGE){ migrate_active_page(); // 触发页迁移 } } ``` #### 4. 优化技巧 - **磨损均衡**:动态调整活跃页位置 - **数据压缩**:定期合并重复地址数据 - **预擦除机制**:后台提前擦除待用页 - **校验增强**:使用CRC32或ECC校验[^1] #### 5. 性能对比 | 指标 | 原生EEPROM | Flash模拟方案 | |------------|------------|---------------| | 单次写时间 | 5ms | 15-50ms | | 最大吞吐量 | 1KB/s | 200-500B/s | | 寿命 | 100K次 | 约10K次 |
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值