flask_sqlalchemy 创建数据库里面没有任何数据?
本人第一次使用flask_sqlalchemy
, 遇到了一点问题, 如下
使用的python
版本为3.6
, 使用conda
作为包管理器, 并且已经成功安装了flask_sqlalchemy
等相关依赖包.
项目简单目录如下:
app.py
db/
models/
__init__.py
todo.py
routes/
__init__.py
todo.py
static/
templates/
app.py
文件内容如下:
# app.py
from flask import (
Flask,
)
from flask_sqlalchemy import SQLAlchemy
import os
from utils import random_str
app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:////' + os.path.join(app.root_path, 'db', 'data.sqlite')
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
app.secret_key = random_str()
db = SQLAlchemy(app)
# 省略了一些无关代码
models/todo.py
文件如下
# models/todo.py
import time
from app import db
class Todo(db.Model):
id = db.Column(db.Integer, primary_key=True)
title = db.Column(db.String(20))
completed = db.Column(db.Boolean, default=False)
ct = db.Column(db.Integer, default=int(time.time()))
def __init__(self, form):
self.title = form.get('title', '')
self.completed = False
self.ct = int(time.time())
操作如下
由于我使用的是conda
, 我在终端先激活环境, 然后打开 flask shell
:
# 我的 conda 环境叫 flask
$ source activate flask
(flask) $ flask shell
显示如下:
Python 3.6.8 |Anaconda, Inc.| (default, Dec 29 2018, 19:04:46)
[GCC 4.2.1 Compatible Clang 4.0.1 (tags/RELEASE_401/final)] on darwin
App: app [production]
Instance: xxx/instance
>>>
然后我在flask shell
执行如下命令:
>>> from app import db
>>> db.create_all()
问题如下:
此时查看文件目录发现在models/
下面存在data.sqlite
文件, 但是该文件里面没有任何内容, 显示大小为0 byte
, 以及我使用数据库管理软件查看发现里面没有任何表任何数据, 同时如果我继续执行db.drop_all
无法删除该数据库文件.
请问这种情况如何解决, 我谷歌了一下没有找到答案, 望能有前辈指点, 不胜感激.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
底下的一个前辈已经回答了比较到位了, 具体我在
stackoverflow
里面也找到了相关的一些文章. 同时自己的代码其实还存在另外一个错误, 自己总结下:如果按照底下那位前辈的做法, 由于我在
models/todo.py
里面引用了app.py
里面的db
, 而在app.py
里面引用了models
里面的模块, 导致循环引用会报错, 所以个人认为比较好的做法为:models
里面初始化db
, 这里db
的初始化可以不需要app
, 如下app.py
里面引用db
models
里面的模块(如前面前辈的回答, 其实这里是一个笔误,models
是一个包)stackoverflow
相关解答如下:db.init(app)
和SQLAlchemy(app)
的区别Flask-SQLAlchemy
模块导入问题create_all()
之前导入数据文件在调用
db.create_all()
之前, 你得先声明 model 结构.像这样