Flask不会创建表

时间:2016-07-09 22:27:19

标签: python flask

我尝试使用flask创建数据库模式,因此我安装了sqlalchemy-migrate和Flask-Migrate。我运行了python db_create.py

已经创建了db,但我无法使用db_create.py

从models.py创建表

这是db_create.py

#!/usr/bin/python
from migrate.versioning import api
from config import SQLALCHEMY_DATABASE_URI
from app import db
import os.path
db.create_all()

这是我的models.py

from core import db
from datetime import *

class User(db.Model):
    __tablename__= "users"
    id =  db.Column('user_id', db.Integer, primary_key=True)
    username = db.Column('username', db.String(20), unique=True, index=True)
    password = db.Column('password', db.String(10))
    email = db.Column('email', db.String(50), unique=True, index=True)
    registered_on = db.Column('registered_on', db.DateTime)
    todos =  db.relationship('Todo', backref='user', lazy='dynamic')

    def __init__(self, username, password, email):
        self.username = username
        self.password = password
        self.email = email
        self.registered_on == datetime.utcnow()

    def set_password(self, password):
        self.password = generate_password_hash(password)

    def check_password(self, password):
        return check_password_hash(self.password, password)

    def is_authentificated(self):
        return True

    def is_active(self):
        return True

    def is_anonymous(self):
        return False

    def get_id(self):
        return unicode(self.id)

    def __repr___(self):
        return '<User %r>' % (self.username)


class Todo(db.Model):
    __tablename__ = 'todos'
    id = db.Column('todo_id', db.Integer, primary_key=True)
    title = db.Column(db.String(255))
    text = db.Column(db.String)
    done = db.Column(db.Boolean)
    #pub_date = db.Column(db.Datetime)
    user_id = db.Column(db.Integer, db.ForeignKey('users.user_id'))


    def __init__(self, title, text):
        self.title = title
        self.text = text
        self.done = False
        self.pub_date = datetime.utcnow()

这是我的config.py

import os
basedir = os.path.abspath(os.path.dirname(__file__))


SQLALCHEMY_DATABASE_URI = "mysql+pymysql://root:xeeW3kah@db/todo"


class Config(object):
    DEBUG = False
    TESTING = False
    CSRF_ENABLED = True
    SECRET_KEY ="An6cGY8ezvAcoZ5pGJuBU9vY0GC1XWjfDg6za7oGd76wVMTCFL"
    SQLALCHEMY_DATABASE_URI = "mysql+pymysql://root:xeeW3kah@db/todo"



class StagingConfig(Config):
    DEVELOPMENT = True
    DEBUG = True


class DevelopmentConfig(Config):
    DEVELOPMENT = True
    DEBUG = True


class TestingConfig(Config):
    TESTING = True
class ProductionConfig(Config):
    DEBUG = False

这是我的app.py

#!/usr/bin/python env

from flask import Flask, session, request, flash, url_for, redirect, render_template, jsonify, abort ,g
from flask_login import login_user, logout_user, current_user, login_required, LoginManager
from stock_scraper import get_data
from models import *
from flask_sqlalchemy import SQLAlchemy
from werkzeug.security import generate_password_hash, check_password_hash
import os


app = Flask(__name__)
app.config.from_pyfile('config.py')
db = SQLAlchemy(app)

@app.route("/data")
#@login_required
def data():
    return jsonify(get_data())


@app.route("/")
@login_required
def index():
    return render_template("index.html")



@app.route('/register', methods=['GET', 'POST'])
def register():
    if request.method == 'GET':
        return render_template('register.html')

    user = User(request.form['username'], request.form['password'], request.form['email'])
    db.session.add(user)
    db.session.commit()
    flash('User successfully registred')
    return redirect(url_for('login'))

@app.route('/login', methods=['GET', 'POST'])
def login():
    if request.method == 'GET':
        return render_template('login.html')
    username = request.form['username']
    password = request.form['password']

    if username=='admin' and password=='admin':
        flash('Logged in successfully')
        return redirect(url_for('data'))
    flash('Username or Password is invalid', 'error')
    return redirect(url_for('login'))



@app.route('/logout')
def logout():
    logout_user()
    return redirect(url_for('index'))


if __name__ == '__main__':

    app.secret_key = "An6cGY8ezvAcoZ5pGJuBU9vY0GC1XWjfDg6za7oGd76wVMTCFL" 

    login_manager = LoginManager()
    login_manager.init_app(app)
    login_manager.login_view = 'login'

    port = int(os.environ.get('PORT', 5000))
    app.run(host='0.0.0.0', port=port, debug=True)

这是core.py

from flask_sqlalchemy import SQLAlchemy
db = SQLAlchemy()

所有文件都位于同一目录

1 个答案:

答案 0 :(得分:1)

您在core.py中创建数据库连接。您可以在模型模块中导入它。

但是在app.py中你创建了一个新的db对象,它对你的模型一无所知:

db = SQLAlchemy(app)

这就是db_create脚本导入的内容,因此脚本无法访问模型。

您应该从app.py中的核心导入相同的数据库。它知道模型。你应该这样做:

from core import db
...
db.init_app(app)
相关问题