SQL:(sqlite3.IntegrityError)NOT NULL约束失败:

fzsnzjdm  于 2022-11-15  发布在  SQLite
关注(0)|答案(2)|浏览(408)

在运行我们的服务器时,我们遇到了一个奇怪的问题,该问题使用了SQLALCHEMIY和flaskSecurity
SQL:INSERT USER(EMAIL,USERNAME,PASSWORD,ACTIVE,SUPER_SAAS_ADMIN,FS_UNIQUIZER,CONFERIFIED_AT,TF_PHONE_NUMBER,TF_PRIMARY_METHOD,TF_TOTP_SECRET)Values(?,?)][参数:(‘test@me.com’,None,‘Password’,1,None,None)]
有谁知道这是什么原因造成的吗?

import os

from flask import Flask, render_template_string
from flask_sqlalchemy import SQLAlchemy
from flask_security import Security, SQLAlchemyUserDatastore, auth_required, RoleMixin, UserMixin
from flask_security.models import fsqla_v2 as fsqla

# Create app
app = Flask(__name__)
app.config['DEBUG'] = True

# Generate a nice key using secrets.token_urlsafe()
app.config['SECRET_KEY'] = os.environ.get("SECRET_KEY", 'xxxxx')
# Bcrypt is set as default SECURITY_PASSWORD_HASH, which requires a salt
# Generate a good salt using: secrets.SystemRandom().getrandbits(128)
app.config['SECURITY_PASSWORD_SALT'] = os.environ.get("SECURITY_PASSWORD_SALT", 'xxxxxx')

# Use an in-memory db
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///database.db'
# As of Flask-SQLAlchemy 2.4.0 it is easy to pass in options directly to the
# underlying engine. This option makes sure that DB connections from the
# pool are still valid. Important for entire application since
# many DBaaS options automatically close idle connections.
app.config["SQLALCHEMY_ENGINE_OPTIONS"] = {
    "pool_pre_ping": True,
}
app.config["SQLALCHEMY_TRACK_MODIFICATIONS"] = False

# Create database connection object
db = SQLAlchemy(app)

# Define models
fsqla.FsModels.set_db_info(db)

# Define models
roles_users = db.Table('roles_users_2',
    db.Column('user_id', db.Integer(), db.ForeignKey('user.id')),
    db.Column('role_id', db.Integer(), db.ForeignKey('role.id')))

class Role(db.Model, RoleMixin):
  id = db.Column(db.Integer(), primary_key=True)
  name = db.Column(db.String(80), unique=True)
  description = db.Column(db.String(255))

class User(db.Model, UserMixin):
    id = db.Column(db.Integer, primary_key=True)
    email = db.Column(db.String(255), unique=True)
    # Make username unique but not required.
    username = db.Column(db.String(255), unique=True, nullable=True)
    password = db.Column(db.String(255))
    active = db.Column(db.Boolean())
    super_saas_admin = db.Column(db.Boolean)
    roles = db.relationship('Role', secondary=roles_users, backref=db.backref('users', lazy='dynamic'))
    fs_uniquifier = db.Column(db.String(255), unique=True, nullable=False)
    confirmed_at = db.Column(db.DateTime())
    tf_phone_number = db.Column(db.String(128), nullable=True)
    tf_primary_method = db.Column(db.String(64), nullable=True)
    tf_totp_secret = db.Column(db.String(255), nullable=True)

# Setup Flask-Security
user_datastore = SQLAlchemyUserDatastore(db, User, Role)
security = Security(app, user_datastore)

# Create a user to test with
@app.before_first_request
def create_user():
    db.create_all()
    if not user_datastore.find_user(email="test@me.com"):
        user_datastore.create_user(email="test@me.com", password="password")
    db.session.commit()

# Views
@app.route("/")
@auth_required()
def home():
    return render_template_string("Hello {{ current_user.email }}")

if __name__ == '__main__':
    app.run()
x6h2sr28

x6h2sr281#

这就是我认为*可能发生的事情--你使用的是FlaskSecurity附带的FSQLA模型--然而你也完全定义了自己的用户模型--我猜有两个用户模型在运行,系统变得混乱了。你应该尝试的是:

class User(db.Model, fsqla.FsUserMixin):
    super_sass_admin = db.Column(db.Boolean) # add your additional fields

就是这样。

bq8i3lrv

bq8i3lrv2#

这在我的PyCharm中正在发生。我假设你有一个包含你的应用程序的模块,以及一个在模块外部运行它的文件。
有两个选项对我都有效:
1.将运行应用程序的文件移到模块中。我将它移到了模块中的app.py中,但我知道在某些环境中这可能会导致问题。
1.使用python <file>.py从终端选项卡运行该文件。这需要你进入应用程序的虚拟环境(如果你已经创建了一个)。

相关问题