Flask:sqlalchemy.exc.ProgrammingError:(psycopg2.ProgrammingError)关系“users”不存在

时间:2016-01-27 21:01:56

标签: python postgresql flask

enter image description here

我正在开发基于http://code.tutsplus.com/tutorials/intro-to-flask-signing-in-and-out--net-29982的烧瓶应用程序。

作为tut的一部分,我正在尝试连接到postgres服务器,其结构如截图所示。我添加了一个db'flask',你可以看到。

根据tut,我在主文件中有以下代码('routes.py'):

from flask.ext.sqlalchemy import SQLAlchemy

from flask import Flask

app = Flask(__name__)

app.config['SQLALCHEMY_DATABASE_URI'] = "postgresql://postgres:123@localhost/flask"

db = SQLAlchemy(app)
from models import User
# db.init_app(app)
db.create_all()
db.session.commit()


admin = User('admin', 'admin@example.com', 'admin1', 'admin1@example.com')
guest = User('admi2', 'admin@ex1ample.com', 'admin', 'admin2@example.com')
# guest = User('guest', 'guest@example.com')
db.session.add(admin)
db.session.add(guest)
db.session.commit()

models.py:

from flask.ext.sqlalchemy import SQLAlchemy
from werkzeug import generate_password_hash, check_password_hash

db = SQLAlchemy()

class User(db.Model):
  __tablename__ = 'users'
  uid = db.Column(db.Integer, primary_key = True)
  firstname = db.Column(db.String(100))
  lastname = db.Column(db.String(100))
  email = db.Column(db.String(120), unique=True)
  pwdhash = db.Column(db.String(54))

  def __init__(self, firstname, lastname, email, password):
    self.firstname = firstname.title()
    self.lastname = lastname.title()
    self.email = email.lower()
    self.set_password(password)

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

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

运行时调试器给出:

sqlalchemy.exc.ProgrammingError: (psycopg2.ProgrammingError) relation "users" does not exist
LINE 1: INSERT INTO users (firstname, lastname, email, pwdhash) VALU...
                    ^
 [SQL: 'INSERT INTO users (firstname, lastname, email, pwdhash) VALUES (%(firstname)s, %(lastname)s, %(email)s, %(pwdhash)s) RETURNING users.uid'] [parameters: {'lastname': 'Admin@Example.Com', 'firstname': 'Admin', 'pwdhash': 'pbkdf2:sha1:1000$eZvJNKHO$64f59c34364e3d6094d126fa3ca2b327ab39e302', 'email': 'admin1'}]

我做错了什么?

2 个答案:

答案 0 :(得分:4)

您链接到的教程有一个名为"创建用户模型"的部分,在该部分下,它告诉您如何使用CREATE TABLE ...创建users表。它为此提供了一些特定于MySQL的语法,尽管您显然使用的是Postgres,因此您的命令会略有不同。

但您发布的截图(来自pgAdmin?)清楚地显示了" public" flask数据库中的模式有零表,所以很明显你还没有创建这个表。您必须创建此表,您应该可以通过pgAdmin执行此操作,例如:

CREATE TABLE users (
  uid serial PRIMARY KEY,
  firstname varchar(100) not null,
  ... follow the guide for the rest of the columns ...
);

答案 1 :(得分:3)

您正在初始化数据库两次。

我建议您仔细研究一下:http://flask.pocoo.org/docs/0.10/patterns/sqlalchemy/

基本上,您希望将内容分成几个文件以防止导入问题并使事情更加清晰。我已经完成了下面的工作。注意,我使用过SQLite,因为我没有在这个盒子上安装Postgres。

app.py

from flask import Flask
app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:////test11.db'

models.py

from flask.ext.sqlalchemy import SQLAlchemy
from app import app
db = SQLAlchemy(app)

class User(db.Model):
    __tablename__ = 'users'
    uid = db.Column(db.Integer, primary_key = True)
    firstname = db.Column(db.String(100))
    lastname = db.Column(db.String(100))
    email = db.Column(db.String(120), unique=True)
    pwdhash = db.Column(db.String(54))

def __init__(self, firstname, lastname, email, password):
    self.firstname = firstname.title()
    self.lastname = lastname.title()
    self.email = email.lower()
    self.set_password(password)

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

def check_password(self, password):
    return password

routes.py

from models import User, db

db.create_all()
db.session.commit()

admin = User('admin', 'admin@example.com', 'admin1', 'admin1@example.com')
guest = User('admi2', 'admin@ex1ample.com', 'admin', 'admin2@example.com')
db.session.add(admin)
db.session.add(guest)
db.session.commit()

我绝对建议查看一些教程!您需要它:您应该了解Web漏洞,最佳实践等。