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, MigrateCommand

app = 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 config

bootstrap = 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」?又不按書上來了不是,還是不仔細看書呢?

解決方案如下:

  1. 把data-dev.sqlite刪除。
  2. 嚴格按照書上的,用db.create_all()命令創建資料庫。方法書上一步一步講清楚了。這裡不重複。

幾點:

  1. 初學者一開始不要用藍本和工廠函數,沒理解的情況下,在學習過程中過早的干這兩件事很容易出錯而且自己弄不清原因。自己去git checkout 5b作者的程序,你走沒學會想飛啊。
  2. 看到你的問題我也很鬱悶,因為書上先是說了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 init

python manage.py db migrate

python manage.py db upgrade

git下來的作者項目就ok,我的卻不行!

後來我用作者的config.py替換了我編寫的config.py

再連續輸入上面三條命令就OK了!

所以我覺的應該是我按書上編寫的config.py有問題,和作者git項目里的不一樣。不是db.create_all()的問題。


推薦閱讀:

Python GUI教程(八):在主窗口中調用對話框
數學不行還學AI-第4話-圖解張量(內有惡貓)
Python數據分析之anaconda安裝和使用
在Windows與MAC中同時安裝Python3.X與2.X的方法

TAG:Python | Flask | Python框架 |