《我用Python写网站02》数据库管理(1)

email = db.Column(db.String(120), unique=True)

password = db.Column(db.String(127), nullable=False)

OK,到了这里,所有的sqlalchemy工作就算做完了,下面开始测试工作。

下面就用Flask Shell完成数据库中表的创建工作,测试代码正确性。

Flask Shell创建数据表


首先使用Ctrl+C停下正在运行的Flask服务,然后在命令行中输入:

(venv)~/ahoh$ flask shell # 启动Flask Shell

Python 3.8.10 (default, Nov 26 2021, 20:14:08)

[GCC 9.3.0] on linux

App: app [production]

Instance: /home/wei/ahoh/instance

                 # 出现命令提示符表示成功启动 

Flask ShellPython可交互编程环境差不多,我们不做深究,直接开始。

Shell中输入以下代码:

from app import db # 引入db变量

db.create_all() # 创建所有的表

以上指令,就会创建所有继承了db.Model的类对应的表了,如果在输入db.create_all()后没有任何输出(没有报错信息),大概率就是成功了。

然后,新开一个终端,进入Mysql查看ahoh数据库中是否真的创建了表:

mysql> use ahoh;

Reading table information for completion of table and column names

You can turn off this feature to get a quicker startup with -A

Database changed

mysql> show tables;

±---------------+

| Tables_in_ahoh |

±---------------+

| t_users |

±---------------+

1 row in set (0.00 sec)

mysql>

还可以使用 DESC指令查看表的结构:

mysql> desc t_users;

±---------±-------------±-----±----±--------±---------------+

| Field | Type | Null | Key | Default | Extra |

±---------±-------------±-----±----±--------±---------------+

| id | int | NO | PRI | NULL | auto_increment |

| username | varchar(80) | NO | UNI | NULL | |

| email | varchar(120) | YES | UNI | NULL | |

| password | varchar(127) | NO | | NULL | |

±---------±-------------±-----±----±--------±---------------+

4 rows in set (0.00 sec)

mysql>

建表工作这里就完成了,下面测试数据表的增删改查。

回到Flask Shell,输入以下指令,向t_users表中插入数据:

from app import User # 引入User类

u = User(username=‘xiaoming’,email=‘123@123.com’,password=‘123456’) # 创建User实例

db.session.add(u) # 向数据库添加新数据

db.session.commit() # 提交

如果执行以上指令之后,没有报错信息,就厉害大发了。

赶快回到Mysql查看一下t_users表里面到底有没有数据,使用以下指令:

mysql> select * from t_users; # 查询表中所有数据

±—±---------±------------±---------+

| id | username | email | password |

±—±---------±------------±---------+

| 1 | xiaoming | 123@123.com | 123456 |

±—±---------±------------±---------+

1 row in set (0.00 sec)

输出和我一样就证明没有问题了!

提醒:密码明文存储是非常愚蠢的行为,这里仅供展示使用,后面会使用加密手段

这也是为什么密码列预留空间很大的原因,你发现了吗

只有一条数据肯定不像话,多加几条:

u1 = User(username=‘aaa’,password=‘bbb’,email=“123@qwe.com”)

u2 = User(username=‘eee’,password=‘bbb’,email=“qwe@qwe.com”)

db.session.add(u1)

db.session.add(u2)

db.session.commit()

然后测试删、改功能:

删除测试

u = User.query.filter_by(username=‘aaa’).first() # 查询

u.username

‘aaa’

db.session.delete(u) # 删除

db.session.commit()

修改测试

u = User.query.filter_by(username=‘xiaoming’).first()

u.username

‘xiaoming’

u.username=‘老天爷’

db.session.add(u)

db.session.commit()

Flask-Migrate数据库版本控制


现在数据库和Flask-SQLAlchemy插件都配置好了,新问题又来了。

我现在对数据表不满意,因为没有年龄age字段,而且我希望最终建立的数据库有很多表,和现在差距肯定非常大。

所以我需要不断的修改db.Model的子类,如何在每次修改对象类后,将改动同步到数据库呢?

这就需要Flask-Migrate插件了,首先,老规矩,安装插件:

(venv) ~/ahoh$ pip install flask-migrate

接下来就是配置Flask-Migrate插件,非常简单,先在app.py文件头部导入:

from flask_migrate import Migrate

然后在db=SQLAlchemy(app)后创建migrate实例:

migrate = Migrate(app, db)

这样就配置完成了。

Flask-Migrate的使用也很方便,包括三条命令

首先就是初始化命令:flask db init

在首次安装Flask-Migrate插件后,需要执行一次,后面就不需要了。

我们先初始化:

(venv) ~/ahoh$ flask db init

Creating directory /home/wei/ahoh/migrations … done

Creating directory /home/wei/ahoh/migrations/versions … done

Generating /home/wei/ahoh/migrations/script.py.mako … done

Generating /home/wei/ahoh/migrations/env.py … done

Generating /home/wei/ahoh/migrations/alembic.ini … done

Generating /home/wei/ahoh/migrations/README … done

Please edit configuration/connection/logging settings in ‘/home/wei/ahoh/migrations/alembic.ini’ before

proceeding.

如果你的输出和我一样,就算成功了。

注意:这些命令都是直接在命令行执行的,并不是在Flask Shell下,别搞错了哦!

接下来迁移命令:flask db migrate

(venv) ~/ahoh$ flask db migrate

INFO [alembic.runtime.migration] Context impl MySQLImpl.

INFO [alembic.runtime.migration] Will assume non-transactional DDL.

INFO [alembic.env] No changes in schema detected.

最后是升级命令: flask db upgrade

(venv) ~/ahoh$ flask db upgrade

INFO [alembic.runtime.migration] Context impl MySQLImpl.

INFO [alembic.runtime.migration] Will assume non-transactional DDL.

到此为止,Flask-Migrate的前期准备工作就完成了,接下来就可以修改数据库了。

修改数据库,首先要修改表对应的类,这里我就在User类中添加一个age属性:

age = db.Column(db.Integer)

然后在命令行中输入命令flask db migrate

(venv) ~/ahoh$ flask db migrate

INFO [alembic.runtime.migration] Context impl MySQLImpl.

INFO [alembic.runtime.migration] Will assume non-transactional DDL.

INFO [alembic.autogenerate.compare] Detected added column ‘t_users.age’

Generating /home/wei/ahoh/migrations/versions/835faba58af3_.py … done

最后,执行升级命令flask db upgrade

(venv) ~/ahoh$ flask db upgrade

INFO [alembic.runtime.migration] Context impl MySQLImpl.

INFO [alembic.runtime.migration] Will assume non-transactional DDL.

INFO [alembic.runtime.migration] Running upgrade -> 835faba58af3, empty message

如果和我一样没有什么错,就算是成功了,下面就去Mysql中查看下:

mysql> desc t_users;

±---------±-------------±-----±----±--------±---------------+

| Field | Type | Null | Key | Default | Extra |

±---------±-------------±-----±----±--------±---------------+

学好 Python 不论是就业还是做副业赚钱都不错,但要学会 Python 还是要有一个学习规划。最后大家分享一份全套的 Python 学习资料,给那些想学习 Python 的小伙伴们一点帮助!

一、Python所有方向的学习路线

Python所有方向路线就是把Python常用的技术点做整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。

二、学习软件

工欲善其事必先利其器。学习Python常用的开发软件都在这里了,给大家节省了很多时间。

三、全套PDF电子书

书籍的好处就在于权威和体系健全,刚开始学习的时候你可以只看视频或者听某个人讲课,但等你学完之后,你觉得你掌握了,这时候建议还是得去看一下书籍,看权威技术书籍也是每个程序员必经之路。

四、入门学习视频

我们在看视频学习的时候,不能光动眼动脑不动手,比较科学的学习方法是在理解之后运用它们,这时候练手项目就很适合了。

五、实战案例

光学理论是没用的,要学会跟着一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。

六、面试资料

我们学习Python必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有阿里大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里无偿获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  • 26
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值