无法使用 SQLAlchemy 创建数据库
Cannot create database with SQLAlchemy
我正在尝试 运行 我的 create_db.py 文件来创建 posts.db 数据库,但它不会在我的项目目录中创建。当我 运行 博客的主文件并尝试登录时,出现以下错误。
我查了这个错误,看到其他人也遇到了这个错误,并在 Whosebug 上询问了这个错误,但 none 似乎对我有所帮助。我读到这可能是因为在创建数据库之前,我的 blog.py 文件中的某些内容是 运行ning main。但是,我认为它与配置有关。主要是数据库的 PATH 可能与 app.config['SQLAlCHEMY_DATABASE_URI'] = 'sqlite:///'
行混淆了。
有什么想法吗?
这里是错误
sqlalchemy.exc.OperationalError
OperationalError: (OperationalError) no such table: posts u'SELECT posts.id AS posts_id, posts.title AS posts_title, posts.post AS posts_post\nFROM posts' ()
OperationalError: (OperationalError) no such table: posts u'SELECT posts.id AS posts_id, posts.title AS posts_title, posts.post AS posts_post\nFROM posts' ()
这是我的代码。这里有三个文件:blog.py、models.py、create_db.py
blog.py
# 博客应用的控制器
from flask import Flask, render_template, request, session,\
flash, redirect, url_for, g
from flask.ext.sqlalchemy import SQLAlchemy
import sqlite3
from functools import wraps
# create the application object
app = Flask(__name__)
# configuration
app.secret_key = 'x13xa8xf5}[xfexd4Zxb8+x07=7xc9xe1Bxcfxbdt.ox87oxc9'
app.config['SQLAlCHEMY_DATABASE_URI'] = 'sqlite:///'
# create sqlalchemy object
db = SQLAlchemy(app)
from models import *
# login required decorator
def login_required(test):
@wraps(test)
def wrap(*args, **kwargs):
if 'logged_in' in session:
return test(*args, **kwargs)
else:
flash('You need to login first.')
return redirect(url_for('login'))
return wrap
@app.route('/', methods = ['GET','POST'])
def login():
error = None
if request.method == 'POST':
if request.form['username'] != 'admin' or request.form['password'] != 'admin':
error = 'Invalid Credentils. Please try again.'
else:
session['logged_in'] = True
return redirect(url_for('main'))
return render_template('login.html', error=error)
@app.route('/main')
@login_required
def main():
posts = db.session.query(BlogPost).all()
return render_template('main.html', posts=posts)
@app.route('/add', methods=['POST'])
@login_required
def add():
title = request.form['title']
post = request.form['post']
if not title or not post:
flash("All fields are required. Please try again.")
return redirect(url_for('main'))
else:
db.session.add(title)
db.session.add(post)
db.session.commit()
db.session.close()
flash('New entry was successfully posted!')
return redirect(url_for('main'))
@app.route('/logout')
def logout():
session.pop('logged_in', None)
flash('You were logged out')
return redirect(url_for('login'))
def connect_db():
return sqlite.connect('posts.db')
if __name__ == '__main__':
app.run(debug = True)
models.py:
from blog import db
class BlogPost(db.Model):
__tablename__ = "posts"
id = db.Column(db.Integer, primary_key=True)
title = db.Column(db.String, nullable=False)
post = db.Column(db.String, nullable=False)
def __init__(self, title, post):
self.title = title
self.post = post
def __repr__(self):
return '<title {}'.format(self.title)
create_db.py
from blog import db
from models import BlogPost
# create the database and the db tables
db.create_all()
# insert
db.session.add(BlogPost("Good","I\'m good."))
db.session.add(BlogPost("Well","I\'m well."))
db.session.add(BlogPost("Post","I\'m a post."))
# commit the changes
db.session.commit()
SQLAlCHEMY_DATABASE_URI
有错字,应该是SQLALCHEMY_DATABASE_URI
,第2个l
。
When 运行ning from blog import db
执行 blog.py
中的某些语句,包括设置路径的 sqlite:///
语句。修改这一行
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///posts.db'
然后在 运行ning create_db.py
之后应该在应用程序的根目录中创建一个数据库。代码中似乎没有设置数据库路径的其他地方。
看起来您可能还会 运行 遇到一些循环导入问题(将抛出 ImportError: cannot import name [name]
)。一些解决方案是将 db = SQLAlchemy..
之类的应用程序初始化内容放入单独的文件中或在文件末尾导入。
我正在尝试 运行 我的 create_db.py 文件来创建 posts.db 数据库,但它不会在我的项目目录中创建。当我 运行 博客的主文件并尝试登录时,出现以下错误。
我查了这个错误,看到其他人也遇到了这个错误,并在 Whosebug 上询问了这个错误,但 none 似乎对我有所帮助。我读到这可能是因为在创建数据库之前,我的 blog.py 文件中的某些内容是 运行ning main。但是,我认为它与配置有关。主要是数据库的 PATH 可能与 app.config['SQLAlCHEMY_DATABASE_URI'] = 'sqlite:///'
行混淆了。
有什么想法吗?
这里是错误
sqlalchemy.exc.OperationalError
OperationalError: (OperationalError) no such table: posts u'SELECT posts.id AS posts_id, posts.title AS posts_title, posts.post AS posts_post\nFROM posts' ()
OperationalError: (OperationalError) no such table: posts u'SELECT posts.id AS posts_id, posts.title AS posts_title, posts.post AS posts_post\nFROM posts' ()
这是我的代码。这里有三个文件:blog.py、models.py、create_db.py
blog.py # 博客应用的控制器
from flask import Flask, render_template, request, session,\
flash, redirect, url_for, g
from flask.ext.sqlalchemy import SQLAlchemy
import sqlite3
from functools import wraps
# create the application object
app = Flask(__name__)
# configuration
app.secret_key = 'x13xa8xf5}[xfexd4Zxb8+x07=7xc9xe1Bxcfxbdt.ox87oxc9'
app.config['SQLAlCHEMY_DATABASE_URI'] = 'sqlite:///'
# create sqlalchemy object
db = SQLAlchemy(app)
from models import *
# login required decorator
def login_required(test):
@wraps(test)
def wrap(*args, **kwargs):
if 'logged_in' in session:
return test(*args, **kwargs)
else:
flash('You need to login first.')
return redirect(url_for('login'))
return wrap
@app.route('/', methods = ['GET','POST'])
def login():
error = None
if request.method == 'POST':
if request.form['username'] != 'admin' or request.form['password'] != 'admin':
error = 'Invalid Credentils. Please try again.'
else:
session['logged_in'] = True
return redirect(url_for('main'))
return render_template('login.html', error=error)
@app.route('/main')
@login_required
def main():
posts = db.session.query(BlogPost).all()
return render_template('main.html', posts=posts)
@app.route('/add', methods=['POST'])
@login_required
def add():
title = request.form['title']
post = request.form['post']
if not title or not post:
flash("All fields are required. Please try again.")
return redirect(url_for('main'))
else:
db.session.add(title)
db.session.add(post)
db.session.commit()
db.session.close()
flash('New entry was successfully posted!')
return redirect(url_for('main'))
@app.route('/logout')
def logout():
session.pop('logged_in', None)
flash('You were logged out')
return redirect(url_for('login'))
def connect_db():
return sqlite.connect('posts.db')
if __name__ == '__main__':
app.run(debug = True)
models.py:
from blog import db
class BlogPost(db.Model):
__tablename__ = "posts"
id = db.Column(db.Integer, primary_key=True)
title = db.Column(db.String, nullable=False)
post = db.Column(db.String, nullable=False)
def __init__(self, title, post):
self.title = title
self.post = post
def __repr__(self):
return '<title {}'.format(self.title)
create_db.py
from blog import db
from models import BlogPost
# create the database and the db tables
db.create_all()
# insert
db.session.add(BlogPost("Good","I\'m good."))
db.session.add(BlogPost("Well","I\'m well."))
db.session.add(BlogPost("Post","I\'m a post."))
# commit the changes
db.session.commit()
SQLAlCHEMY_DATABASE_URI
有错字,应该是SQLALCHEMY_DATABASE_URI
,第2个l
。
When 运行ning from blog import db
执行 blog.py
中的某些语句,包括设置路径的 sqlite:///
语句。修改这一行
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///posts.db'
然后在 运行ning create_db.py
之后应该在应用程序的根目录中创建一个数据库。代码中似乎没有设置数据库路径的其他地方。
看起来您可能还会 运行 遇到一些循环导入问题(将抛出 ImportError: cannot import name [name]
)。一些解决方案是将 db = SQLAlchemy..
之类的应用程序初始化内容放入单独的文件中或在文件末尾导入。