【问题标题】:Something is wrong with my model SQLAlchemy SQlite Flask Python我的模型 SQLAlchemy SQlite Flask Python 有问题
【发布时间】:2020-12-23 19:40:58
【问题描述】:

我的模型有问题吗?你有什么异常吗?尝试使用 SQLAlchemy 将用户和密码存储到 SQLite db 但返回错误,指出用户表中的列 pwd 不存在,实际上,如果我检查 sqlite> .schema 它返回具有正确结构和 pwd 列的表,不如果我查询,里面的数据。

我首先用 Table() 函数创建表,然后在我定义 User 类,可能是因为在类中没有对表的列名的引用?但我已经导入了 tablename="user" 所以它不应该工作吗?

from flask import Flask 
from flask_sqlalchemy import SQLAlchemy
from flask_bcrypt import Bcrypt
from sqlalchemy import *

app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///data-users.sqlite'
db = SQLAlchemy(app)

class User(db.Model):
    
    id = db.Column(db.Integer(), primary_key = True, autoincrement=True)
    username = db.Column(db.String(64), unique = True)
    pwd = db.Column(db.String())

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

这里我将用户数据存储在表中

        from store_user_db import User, db

        db.create_all()

        DICP_FTP_DESTINATION_PSW=self.submit_pwd()

        user = User(id=001,username="ita_itf",pwd=DICP_FTP_DESTINATION_PSW)
        db.session.add(user)
        db.session.commit()

这是错误:

sqlalchemy.exc.OperationalError

OperationalError: (sqlite3.OperationalError) table user has no column named pwd
[SQL: INSERT INTO user (id, username, pwd) VALUES (?, ?, ?)]
[parameters: (1, 'ita_itf', <read-only buffer for 0x7efe495709f0, size -1, offset 0 at 0x7efe500c3830>)]

【问题讨论】:

  • 也许我应该参考表名而不是指数据库?像 userstable.Column(...) 而不是 db.Column(...) ??

标签: python sqlite flask sqlalchemy flask-sqlalchemy


【解决方案1】:

db.create_all() 只会在表不存在时创建表。我怀疑您的问题是您最近创建了该表,此时您的模型中还没有 pwd 列。

所以现在你运行db.create_all(),它基本上什么都不做(因为user 表已经存在)但是当你尝试访问从未创建的pwd 列时它会崩溃。

您可以db.drop_all() 销毁所有当前表,或者您可以手动(或使用迁移工具)添加“缺失”pwd 列,以便数据库与模型匹配。

此外,在这个特定示例中,所有这些代码都没有做任何事情(除非您在未包含的代码中做一些不寻常的事情)。

engine= create_engine(app.config['SQLALCHEMY_DATABASE_URI'])

#CREATE TABLE
meta=MetaData()
userstable = Table('user', meta, \
    Column('id', Integer, primary_key = True, autoincrement=True), \
    Column('username', String, unique = True), \
    Column('pwd', LargeBinary,unique = True))
meta.create_all(engine)

示例工作版本

from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from flask_bcrypt import Bcrypt

app = Flask(__name__)
app.config["SQLALCHEMY_DATABASE_URI"] = "sqlite:///example.sqlite3"

bcrypt = Bcrypt(app)
db = SQLAlchemy(app)


class User(db.Model):
    __tablename__ = "user"
    id = db.Column(db.Integer(), primary_key=True, autoincrement=True)
    username = db.Column(db.String(64), unique=True)
    pwd = db.Column(db.LargeBinary(), unique=True)

    def __init__(self, id, username, pwd):
        self.id = id
        self.username = username
        self.pwd = bcrypt.generate_password_hash(pwd)


if __name__ == "__main__":
    db.drop_all()  # destroy all the tables.
    db.create_all()  # create all fresh new tables.
    u = User(1, "static", "password")
    db.session.add(u)
    db.session.commit()

    u = User.query.first()  # check out data got stored.
    print(u.pwd)

【讨论】:

  • 我明白你的意思,我已经删除了 db.create_all(),我已经在 sqlite 中删除了表用户,仔细检查并且那里没有表。然后我再次运行我的应用程序并使用 pwd 列创建正确的表,我在 sqlite>.schema 中检查它,并且 pwd 它在那里,但仍然返回以下错误
  • OperationalError: (sqlite3.OperationalError) 表用户没有名为 pwd 的列
  • 我也尝试过启动一个全新的数据库,所以之前没有表,同样的问题,我认为它尝试在其中存储密码时有问题。该表似乎已正确创建。
  • 也许当我尝试存储密码时我使用 db.session.add(user),但是当我创建表时确实没有对 db 的引用。可能是这样吗?是不是要引用表格?
  • 如果您将app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///data-users2.sqlite' 更改为app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///data-users2.sqlite3',同样的问题是否仍然存在? (我想知道您是否删除/删除了错误的 SQLlite 表)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-05-15
  • 1970-01-01
  • 1970-01-01
  • 2021-12-31
  • 1970-01-01
  • 2010-10-09
  • 1970-01-01
相关资源
最近更新 更多