Flask中,用upgrade命令遷移資料庫後,生成的資料庫里沒有數據表怎麼回事?
我是按照《Flask Web開發》這本書一步一步走的,走到7.7節創建資料庫時候用python manage.py db upgrade 命令後,在項目根目錄創建了一個data-dev.sqlite文件,但這個文件里沒有數據表,我不知道錯誤原因在哪.
執行python manage.py db upgrade 命令後提示如下:manage.py內容如下:
import os
from app import create_app, db
from app.models import User, Role
from flask.ext.script import Manager, Shell
from flask.ext.migrate import Migrate, MigrateCommandapp = create_app(os.getenv(FLASK_CONFIG) or default)
manager = Manager(app)
migrate = Migrate(app, db)def make_shell_context():
return dict(app=app, db=db, User=User, Role=Role)
manager.add_command("shell", Shell(make_context=make_shell_context))
manager.add_command(db, MigrateCommand)@manager.command
def test():
"""Run the unit tests."""
import unittest
tests = unittest.TestLoader().discover(tests)
unittest.TextTestRunner(verbosity=2).run(tests)if __name__ == __main__:
manager.run()
models.py內容如下:
from . import db
class Role(db.Model):
__tablename__ = roles
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(64), unique=True)
users = db.relationship(User, backref=role, lazy=dynamic)def __repr__(self):
return &% self.name class User(db.Model):
__tablename__ = users
id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String(64), unique=True, index=True)
role_id = db.Column(db.Integer, db.ForeignKey(roles.id))def __repr__(self):
return &% self.username
app\__init__.py的內容如下:
from flask import Flask
from flask.ext.bootstrap import Bootstrap
from flask.ext.mail import Mail
from flask.ext.moment import Moment
from flask.ext.sqlalchemy import SQLAlchemy
from config import configbootstrap = Bootstrap()
mail = Mail()
moment = Moment()
db = SQLAlchemy()def create_app(config_name):
app = Flask(__name__)
app.config.from_object(config[config_name])
config[config_name].init_app(app)bootstrap.init_app(app)
mail.init_app(app)
moment.init_app(app)
db.init_app(app)from .main import main as main_blueprint
app.register_blueprint(main_blueprint)return app
謝謝邀請。
創建資料庫怎麼用「python manage.py db upgrade」?又不按書上來了不是,還是不仔細看書呢?
解決方案如下:- 把data-dev.sqlite刪除。
- 嚴格按照書上的,用db.create_all()命令創建資料庫。方法書上一步一步講清楚了。這裡不重複。
幾點:
- 初學者一開始不要用藍本和工廠函數,沒理解的情況下,在學習過程中過早的干這兩件事很容易出錯而且自己弄不清原因。自己去git checkout 5b作者的程序,你走沒學會想飛啊。
- 看到你的問題我也很鬱悶,因為書上先是說了db.create_all()創建資料庫,之後資料庫章節的末尾,才談到以後在有新增數據的情況下,用db.create_all()就不好了,才引出了Flask-Migrate的方法。你要是按照書上一步一步來的,應該早就用db.create_all()創建了資料庫,或者在這裡出問題。而你直接用「python manage.py db upgrade」,跳過了db.create_all(),所以你的書和我看的不一樣?
先執行python manage.py db migrate
然後再python manage.py db upgrade
migrate創建遷移腳本了?
希望對你們有幫助.
環境其他什麼都對的話,應該是迴環引用的問題(不知道說法對不對),就是在db還沒初始化的時候,models需要使用db,所以沒有檢測到數據變化。
解決方案:
db = SQLAlchemy(app)
import models # &<--- move this anywhere after db is instantiated
e 我發現錯誤是原來是我把URI寫成了URL了
------------------------
我也遇到了同樣的問題我連續輸入
python manage.py db initpython manage.py db migratepython manage.py db upgradegit下來的作者項目就ok,我的卻不行!後來我用作者的config.py替換了我編寫的config.py
再連續輸入上面三條命令就OK了!所以我覺的應該是我按書上編寫的config.py有問題,和作者git項目里的不一樣。不是db.create_all()的問題。推薦閱讀:
※Python GUI教程(八):在主窗口中調用對話框
※數學不行還學AI-第4話-圖解張量(內有惡貓)
※Python數據分析之anaconda安裝和使用
※在Windows與MAC中同時安裝Python3.X與2.X的方法