Flask的SQLAlchemy备份/导出工具
项目描述
AlchemyDumps 
你在使用Flask和SQLAlchemy吗?哇,真巧!
此软件包允许您使用SQLAlchemy的dumps()方法备份和恢复所有数据。
这是一种简单的方法(仅一个命令,我是认真的)来保存您数据库中存储的所有数据。
您可以将它保存在本地或通过FTP保存在远程服务器上。
警告 @baumatron 发现了一个重要的错误:当前这个包无法备份非标准映射,例如多对多关联表。这是一个悬而未决的问题,我并不期望在接下来的几周内修复它——欢迎Pull requests。
安装
首先安装包:pip install Flask-AlchemyDumps
然后将您的Flask应用程序和SQLALchemy数据库传递给它。
例如
- 第二行从包中导入对象。
- 最后一行为您的应用程序和数据库实例化
AlchemyDumps
。
from flask import Flask
from flask_alchemydumps import AlchemyDumps
from flask_sqlalchemy import SQLAlchemy
# init Flask
app = Flask(__name__)
# init SQLAlchemy and Flask-Script
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///app.db'
db = SQLAlchemy(app)
# init Alchemy Dumps
alchemydumps = AlchemyDumps(app, db)
远程备份(通过FTP)
如果您想通过FTP将备份保存到远程服务器,只需确保设置以下环境变量,用正确的凭据替换占位符信息
export ALCHEMYDUMPS_FTP_SERVER=ftp.server.com
export ALCHEMYDUMPS_FTP_USER=johndoe
export ALCHEMYDUMPS_FTP_PASSWORD=secret
export ALCHEMYDUMPS_FTP_PATH=/absolute/path/
如果您愿意,在/tests
文件夹中有一个.env.sample
。只需将其复制到您的应用程序根目录,重命名为.env
,并插入您的凭据。
使用应用程序工厂
可以使用此包与应用程序工厂一起使用
alchemydumps = AlchemyDumps()
def create_app(settings):
…
alchemydumps.init_app(app, db)
…
.gitignore
您可能希望将alchemydumps/
添加到您的.gitignore
中。这是AlchemyDumps
保存备份文件的文件夹。
示例
假设您有以下模型——也就是说,这些SQLAlchemy映射类
class User(db.Model):
id = db.Column(db.Integer, primary_key=True)
email = db.Column(db.String(140), index=True, unique=True)
posts = db.relationship('Post', backref='author', lazy='dynamic')
class Post(db.Model):
id = db.Column(db.Integer, primary_key=True)
title = db.Column(db.String(140))
content = db.Column(db.UnicodeText)
author_id = db.Column(db.Integer, db.ForeignKey('user.id'))
只是以防万一:这是一个简单的示例,但您也可以使用抽象映射类。
您可以备份所有数据
python manage.py alchemydumps create
输出
==> 3 rows from User saved as /vagrant/alchemydumps/db-bkp-20141115172107-User.gz
==> 42 rows from Post saved as /vagrant/alchemydumps/db-bkp-20141115172107-Post.gz
您可以列出您已创建的备份
python manage.py alchemydumps history
输出
==> ID: 20141114203949 (from Nov 15, 2014 at 17:21:07)
/vagrant/alchemydumps/db-bkp-20141115172107-User.gz
/vagrant/alchemydumps/db-bkp-20141115172107-Post.gz
==> ID: 20141115140629 (from Nov 15, 2014 at 14:06:29)
/vagrant/alchemydumps/db-bkp-20141115140629-User.gz
/vagrant/alchemydumps/db-bkp-20141115140629-Post.gz
您可以恢复备份
python manage.py alchemydumps restore -d 20141115172107
输出
==> db-bkp-20141115172107-User.gz totally restored.
==> db-bkp-20141115172107-Post.gz totally restored.
您可以删除现有的备份
python manage.py alchemydumps remove -d 20141115172107
输出
==> Do you want to delete the following files?
/vagrant/alchemydumps/db-bkp-20141115172107-User.gz
/vagrant/alchemydumps/db-bkp-20141115172107-Post.gz
==> Press "Y" to confirm, or anything else to abort: y
db-bkp-20141115172107-User.gz deleted.
db-bkp-20141115172107-Post.gz deleted.
您可以使用自动清理命令
autoclean
命令遵循以下规则来删除备份
python manage.py alchemydumps autoclean
输出
==> 8 backups will be kept:
ID: 20130703225903 (from Jul 03, 2013 at 22:59:03)
/vagrant/alchemydumps/db-bkp-20130703225903-User.gz
/vagrant/alchemydumps/db-bkp-20130703225903-Post.gz
ID: 20120405013054 (from Apr 05, 2012 at 01:30:54)
/vagrant/alchemydumps/db-bkp-20120405013054-User.gz
/vagrant/alchemydumps/db-bkp-20120405013054-Post.gz
ID: 20101123054342 (from Nov 23, 2010 at 05:43:42)
/vagrant/alchemydumps/db-bkp-20101123054342-User.gz
/vagrant/alchemydumps/db-bkp-20101123054342-Post.gz
ID: 20090708100815 (from Jul 08, 2009 at 10:08:15)
/vagrant/alchemydumps/db-bkp-20090708100815-User.gz
/vagrant/alchemydumps/db-bkp-20090708100815-Post.gz
ID: 20081208191908 (from Dec 08, 2008 at 19:19:08)
/vagrant/alchemydumps/db-bkp-20081208191908-User.gz
/vagrant/alchemydumps/db-bkp-20081208191908-Post.gz
ID: 20070114122922 (from Jan 14, 2007 at 12:29:22)
/vagrant/alchemydumps/db-bkp-20070114122922-User.gz
/vagrant/alchemydumps/db-bkp-20070114122922-Post.gz
ID: 20060911035318 (from Sep 11, 2006 at 03:53:18)
/vagrant/alchemydumps/db-bkp-20060911035318-User.gz
/vagrant/alchemydumps/db-bkp-20060911035318-Post.gz
ID: 20051108082503 (from Nov 08, 2005 at 08:25:03)
/vagrant/alchemydumps/db-bkp-20051108082503-User.gz
/vagrant/alchemydumps/db-bkp-20051108082503-Post.gz
==> 11 backups will be deleted:
ID: 20120123032442 (from Jan 23, 2012 at 03:24:42)
/vagrant/alchemydumps/db-bkp-20120123032442-User.gz
/vagrant/alchemydumps/db-bkp-20120123032442-Post.gz
ID: 20101029100412 (from Oct 29, 2010 at 10:04:12)
/vagrant/alchemydumps/db-bkp-20101029100412-User.gz
/vagrant/alchemydumps/db-bkp-20101029100412-Post.gz
ID: 20100526185156 (from May 26, 2010 at 18:51:56)
/vagrant/alchemydumps/db-bkp-20100526185156-User.gz
/vagrant/alchemydumps/db-bkp-20100526185156-Post.gz
ID: 20100423085529 (from Apr 23, 2010 at 08:55:29)
/vagrant/alchemydumps/db-bkp-20100423085529-User.gz
/vagrant/alchemydumps/db-bkp-20100423085529-Post.gz
ID: 20081006074458 (from Oct 06, 2008 at 07:44:58)
/vagrant/alchemydumps/db-bkp-20081006074458-User.gz
/vagrant/alchemydumps/db-bkp-20081006074458-Post.gz
ID: 20080429210254 (from Apr 29, 2008 at 21:02:54)
/vagrant/alchemydumps/db-bkp-20080429210254-User.gz
/vagrant/alchemydumps/db-bkp-20080429210254-Post.gz
ID: 20080424043716 (from Apr 24, 2008 at 04:37:16)
/vagrant/alchemydumps/db-bkp-20080424043716-User.gz
/vagrant/alchemydumps/db-bkp-20080424043716-Post.gz
ID: 20080405110244 (from Apr 05, 2008 at 11:02:44)
/vagrant/alchemydumps/db-bkp-20080405110244-User.gz
/vagrant/alchemydumps/db-bkp-20080405110244-Post.gz
ID: 20060629054914 (from Jun 29, 2006 at 05:49:14)
/vagrant/alchemydumps/db-bkp-20060629054914-User.gz
/vagrant/alchemydumps/db-bkp-20060629054914-Post.gz
ID: 20060329020048 (from Mar 29, 2006 at 02:00:48)
/vagrant/alchemydumps/db-bkp-20060329020048-User.gz
/vagrant/alchemydumps/db-bkp-20060329020048-Post.gz
ID: 20050324012859 (from Mar 24, 2005 at 01:28:59)
/vagrant/alchemydumps/db-bkp-20050324012859-User.gz
/vagrant/alchemydumps/db-bkp-20050324012859-Post.gz
==> Press "Y" to confirm, or anything else to abort. y
db-bkp-20120123032442-User.gz deleted.
db-bkp-20120123032442-Post.gz deleted.
db-bkp-20101029100412-User.gz deleted.
db-bkp-20101029100412-Post.gz deleted.
db-bkp-20100526185156-User.gz deleted.
db-bkp-20100526185156-Post.gz deleted.
db-bkp-20100423085529-User.gz deleted.
db-bkp-20100423085529-Post.gz deleted.
db-bkp-20081006074458-User.gz deleted.
db-bkp-20081006074458-Post.gz deleted.
db-bkp-20080429210254-User.gz deleted.
db-bkp-20080429210254-Post.gz deleted.
db-bkp-20080424043716-User.gz deleted.
db-bkp-20080424043716-Post.gz deleted.
db-bkp-20080405110244-User.gz deleted.
db-bkp-20080405110244-Post.gz deleted.
db-bkp-20060629054914-User.gz deleted.
db-bkp-20060629054914-Post.gz deleted.
db-bkp-20060329020048-User.gz deleted.
db-bkp-20060329020048-Post.gz deleted.
db-bkp-20050324012859-User.gz deleted.
db-bkp-20050324012859-Post.gz deleted.
需求 & 依赖
AlchemyDumps经过测试,应与Python 3.6+兼容。
测试
如果您想为当前Python版本运行测试
poetry install
poetry run nosetests
我们还使用一些风格和质量检查器
poetry run black . --check
poetry run flake8 flask_alchemydumps/ tests/
如果您想覆盖所有支持的Python版本,您需要安装并使其通过pyenv
可用。然后只需poetry run tox
。