Flask使用SQLAlchemy两种方式

本文介绍如何使用SQLAlchemy进行数据库操作,并结合Alembic实现数据库版本控制。此外,还介绍了如何通过Flask插件简化这些过程。

一、SQLAlchemy和Alembic

主要使用原生的SQLAlchemy进行数据库操作和使用Alemic进行数据库版本控制

I 创建数据库主要有三个步骤
  1. 创建表的父类/数据库连接/Session   

       from sqlalchemy import Column, String, create_engine
       from sqlalchemy.ext.declarative import declarative_base
       from sqlalchemy.orm import relationship, sessionmaker
       
       BaseModel = declarative_base()
       engine = create_engine('mysql+mysqlconnector://root:password@localhost:3306/test')
       DBSession = sessionmaker(bind=engine)        
  1. 初始化每个表的class定义

    class UserBaseModel():
        __tablename__ = 'user_elabels'
        id = Column(Integer, privatemary_key=True)
        email = Column(String(25), index = True, nullable=False)
        md5_pwd = Column(String(128), nullable=False)
    
        @property
        def password(self):
            raise AttributeError('password cat not be read')
    
        @password.setter
        def password(self, pwd):
            m2 = hashlib.md5()
            m2.update(pwd)
            self.md5_pwd = m2.hexdigest()
    
        def verify_password(self, in_pwd):
            m2 = hashlib.md5()
            m2.update(in_pwd)
            return self.md5_pwd == m2.hexdigest()

     

  2. 创建表以及使用 sqlalchemy可以通过寻找BaseModel的所有子类完成表的创建

    BaseModel.metadata.create_all(engine)
    # 创建session对象:
    session = DBSession()
    # 创建新User对象:
    new_user = User(...)
    # 添加到session:
    session.add(new_user)
    # 提交即保存到数据库:
    session.commit()
    # 关闭session:
    session.close()

     

参考资料:

https://www.liaoxuefeng.com/wiki/001374738125095c955c1e6d8bb493182103fac9270762a000/0014021031294178f993c85204e4d1b81ab032070641ce5000

http://docs.sqlalchemy.org/en/latest/orm/tutorial.html

II 使用Alembic进行数据库版本管理
  1. pip install alembic
  2. 修改alembic.ini

     改:
        sqlalchemy.url = ...
        为
        sqlalchemy.url = mysql://account:password@127.0.0.1/model_test

     

  3. 修改alembic/env.py

    import sys                                             
    from os.path import abspath, dirname 
    sys.path.append(dirname(dirname(abspath(__file__)))) 
    from models import BaseModel
    target_metadata = BaseModel.metadata

     

  4. 自动创建版本

    alembic revision --autogenerate -m "initdb"
    ###这时候会在数据库中看到所有的表已经创建
    
    #其他命令:
    
    #更新数据库:
        alembic upgrade 版本号
    #更新到最新版:
        alembic upgrade head
    #降级:
        alembic downgrade 版本号
    #降级到最初版本:
        alembic downgrade head

     

流程说明:

当我们第一次执行alembic revision --autogenerate -m "XXX"命令的时候,就会自动在数据库中创建表,此时alembic/versions/versionnumXXX.py中的upgrade()和downgrade()函数都为空。

数据库表模型发生变动时候,执行 alembic revision --autogenerate -m "XXX" 时候,就会在alembic/versions中自动生成一个versionnoXXX.py 的文件中的upgrade()函数和downgrade()自动生成迁移脚本,此时执行

```
alembic upgrade 版本号

或者

alemibc upgrade +1
```

 

就会执行最新生成的versionnoXXX.py中的文件。 所以,也可以手工直接在alembic/versions下的文件中写Python代码执行升级,不过要注意版本号。

参考资料: http://alembic.zzzcomputing.com/en/latest/tutorial.html#the-migration-environment https://segmentfault.com/a/1190000006949536

二、使用Flask插件

主要基于flask-sqlalchemy, flask-migrate(封装了alembic), flask-script

from flask_sqlalchemy import SQLAlchemy
from flask_script import Manager 
from flask_migrate import Migrate, MigrateCommand
basedir = os.path.abspath(os.path.dirname(file))

app = Flask(name) app.config['SQLALCHEMYDATABASEURI'] = \ 'sqlite:///' + os.path.join(basedir, 'data.sqlite') 

app.config['SQLALCHEMY_COMMIT_ON_TEARDOWN'] = True
db = SQLAlchemy(app) manager = Manager(app) migrate = Migrate(app, db) manager.add_command('db', MigrateCommand) 

 

其中flask-sqlalchemy封装了sqlalchemy,不用导入sqlalchemy的一些类和函数,比如在上面的例子中可以通过db.Column, db.relationship直接调用而不用再次导入

flask-alembic封装了alemibc,可以不用手工配置alembic.ini 和 alemibc/env.py 常用命令:

创建迁移仓库:
    python main.py db init
    
生成迁移脚本:
    python main.py db migrate -m "initial migration"
    
执行迁移脚本:
    python main.py db upgrade

 

参考资料: 基于python的web应用开发实战

转载于:https://www.cnblogs.com/fcyworld/p/7693781.html

使用 SQLAlchemy 操作数据库时,可以结合 `ON DUPLICATE KEY UPDATE` 语句实现根据条件查询、更新或插入记录的功能。假设 `workhour` 表中设置了 `工号` 和 `日期` 的联合唯一约束,可以通过以下方式实现需求。 ### 使用 SQLAlchemy 实现插入或更新操作 SQLAlchemy 提供了 `insert` 和 `on_duplicate_key_update` 方法来实现插入或更新逻辑。具体实现如下: ```python from sqlalchemy import create_engine, Table, Column, String, Date, MetaData from sqlalchemy.dialects.mysql import insert # 创建数据库连接 engine = create_engine("mysql+mysqlconnector://数据库用户名:数据库密码@MySQL数据库服务器地址:3306/数据库名称", echo=True) metadata = MetaData() # 定义表结构 workhour = Table( 'workhour', metadata, Column('工号', String(50), primary_key=True), Column('日期', Date, primary_key=True), Column('其他字段', String(255)) ) # 插入或更新数据 stmt = insert(workhour).values( 工号='111', 日期='2025-01-01', 其他字段='新的值' ) # 如果记录已存在,则更新其他字段 stmt = stmt.on_duplicate_key_update( 其他字段='新的值' ) # 执行语句 with engine.connect() as conn: conn.execute(stmt) conn.commit() ``` 通过上述代码,可以实现以下逻辑:当 `工号` 为 `111` 且 `日期` 为 `2025-01-01` 的记录存在时,执行更新操作;如果不存在,则插入新记录。此方法依赖于数据库的唯一约束,确保 `ON DUPLICATE KEY UPDATE` 能够正确触发[^2]。 ### 注意事项 - **唯一约束**:必须确保 `工号` 和 `日期` 字段设置联合唯一索引,否则 `ON DUPLICATE KEY UPDATE` 无法正常工作。 - **性能优化**:在高并发环境下,建议使用事务控制以保证操作的原子性。 - **SQLAlchemy 依赖**:上述代码依赖于 `sqlalchemy.dialects.mysql.insert`,仅适用于 MySQL 数据库。 ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值