无法通过控制台创建sqlite3数据库,如Flask Web开发书中所示
我不太确定问题出在哪里,所以我会尽量提供更多信息,希望有人能发现错误。
书里教我如何设计对象,这些对象会被SQLAlchemy用来创建数据库。然后我需要在控制台执行以下操作:
(venv) $ python hello.py shell
>>> from hello import db
>>> db.create_all()
这个操作应该在我的应用程序目录下创建一个数据库文件,但实际上并没有创建。hello import db这一行是正常的。
>>> db
<SQLAlchemy engine='sqlite://'>
db.create_all()
没有返回任何错误,但数据库文件还是没有在我的应用程序目录下创建。我想特别提一下这一行(这样写对吗?):
app.config['SQLALECHMY_DATABASE_URI'] =\
'sqlite:///' + os.path.join(basedir, 'data.sqlite') #Final value: 'sqlite:////home/nick/dev/flare/data.sqlite'
这是我整个hello.py文件的内容:
import os
from flask import Flask, render_template, session, url_for, redirect, flash
from flask.ext.script import Manager
from flask.ext.bootstrap import Bootstrap
from flask.ext.moment import Moment
from flask.ext.wtf import Form
from flask.ext.sqlalchemy import SQLAlchemy
from wtforms import StringField, SubmitField
from wtforms.validators import Required
basedir = os.path.abspath(os.path.dirname(__file__))
app = Flask(__name__)
app.config['SECRET_KEY'] = 'random key'
app.config['SQLALECHMY_DATABASE_URI'] =\
'sqlite:///' + os.path.join(basedir, 'data.sqlite') #Final value: 'sqlite:////home/nick/dev/flare/data.sqlite'
app.config['SQLALCHEMY_COMMIT_ON_TEARDOWN'] = True
manager = Manager(app)
bootstrap = Bootstrap(app)
moment = Moment(app)
db = SQLAlchemy(app)
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')
def __repr__(self):
return '<Role %r>' % 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 '<User %r>' % self.username
class NameForm(Form):
name = StringField('What is your name', validators=[Required()])
submit = SubmitField('Submit')
@app.route('/', methods=['GET', 'POST'])
def index():
form = NameForm()
if form.validate_on_submit():
old_name = session.get('name')
if old_name is not None and old_name != form.name.data:
flash('Looks like you have changed your name')
session['name'] = form.name.data
form.name.data = ''
return redirect(url_for('index'))
return render_template('index.html', form=form, name=session.get('name'))
@app.route('/user/<name>')
def user(name):
return render_template('user.html', name=name)
@app.errorhandler(404)
def page_not_found(e):
return render_template('404.html'), 404
@app.errorhandler(500)
def internal_server_error(e):
return render_template('500.html'), 500
if __name__ == "__main__":
manager.run()
1 个回答
3
你的配置里有个拼写错误:
app.config['SQLALECHMY_DATABASE_URI'] =\
这里的 SQLALCHEMY
拼错了,应该是:
app.config['SQLALCHEMY_DATABASE_URI'] =\
因为你拼写错了,所以使用了默认的 sqlite://
,这其实是一个内存数据库。