【问题标题】:Cannot create database with SQLAlchemy无法使用 SQLAlchemy 创建数据库
【发布时间】:2015-03-04 22:43:25
【问题描述】:

我正在尝试运行我的 create_db.py 文件来创建 posts.db 数据库,但它不会在我的项目目录中创建。当我运行博客的主文件并尝试登录时,我收到以下错误。

我查看了这个错误,发现其他人也得到了它,并在 Stackoverflow 上询问了它,但他们似乎都没有帮助我。我已经读到这可能是因为我的 blog.py 文件中的某些内容在创建数据库之前正在运行 ma​​in。但是,我认为这与配置有关。主要是数据库的 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()

【问题讨论】:

    标签: python sqlite flask sqlalchemy


    【解决方案1】:

    SQLAlCHEMY_DATABASE_URI 有错别字,应该是SQLALCHEMY_DATABASE_URI,第二个l

    当运行from blog import db 时,blog.py 中的某些语句会被执行,包括带有sqlite:/// 的语句,这是设置路径的位置。修改这一行

    app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///posts.db'
    

    然后在运行create_db.py 之后应该在应用程序的根目录中创建一个数据库。代码中似乎没有其他地方设置了db路径。

    看起来您可能还会遇到一些循环导入问题(将抛出ImportError: cannot import name [name])。一些解决方案是将应用程序初始化内容(如 db = SQLAlchemy..)放入单独的文件中或在文件末尾导入。

    【讨论】:

    • 比你还有效。我没有遇到任何循环导入问题。但是,我确实发现我添加新博客文章的代码是错误的。但这很容易解决。 db.session.add(BlogPost(title, post)) 而不是 db.session.add(title, post)
    • 谢谢,它也适用于我。
    猜你喜欢
    • 1970-01-01
    • 2021-07-09
    • 2023-01-29
    • 2021-06-14
    • 2019-07-10
    • 2015-06-06
    • 2021-05-25
    • 2017-02-25
    相关资源
    最近更新 更多