问题描述
我也遇到了 Flask-Security 和 sqlAlchemy 的问题。在下面的示例中,我可以创建一个用户,一旦创建了用户,我就想创建具有一对多关系的线程。当我将用户对象传递给查询时,收到以下错误消息;
sqlalchemy.exc.InterfaceError: (sqlite3.InterfaceError) 错误绑定
参数 1 - 可能不受支持的类型。 [sql:插入线程
(title,user_id) VALUES (?,?)] [参数: ('NewThread',
import os
from flask import Flask
from flask_sqlalchemy import sqlAlchemy
from flask_security import sqlAlchemyUserDatastore,Security
db = sqlAlchemy()
security = Security()
def create_app():
app = Flask(__name__)
db.init_app(app)
app.config['SECRET_KEY'] = 'secretkey__'
app.config['Security_PASSWORD_SALT'] = 'secretsalt__'
app.config['sqlALCHEMY_DATABASE_URI'] = 'sqlite:///database.db'
app.config['sqlALCHEMY_TRACK_MODIFICATIONS'] = False
class RolesUsers(db.Model):
id = db.Column(db.Integer(),primary_key=True)
user_id = db.Column('user_id',db.Integer(),db.ForeignKey('user.id'))
role_id = db.Column('role_id',db.ForeignKey('role.id'))
class User(db.Model):
id = db.Column(db.Integer,primary_key=True)
username = db.Column(db.String(255),unique=True,nullable=True)
active = db.Column(db.Boolean())
fs_uniquifier = db.Column(db.String(255),nullable=False)
roles = db.relationship(
'Role',secondary='roles_users',backref=db.backref('users',lazy='dynamic'))
threads = db.relationship('Thread',backref='author',lazy=True)
class Role(db.Model):
id = db.Column(db.Integer(),primary_key=True)
name = db.Column(db.String(80),unique=True)
class Thread(db.Model):
id = db.Column(db.Integer,primary_key=True)
title = db.Column(db.String(50),nullable=False)
user_id = db.Column(db.Integer,db.ForeignKey('user.id'))
user_datastore = sqlAlchemyUserDatastore(db,User,Role)
security.init_app(app,user_datastore)
# Create user works as expected
@app.route('/user/<string:username>')
def create_user(username):
new_user = user_datastore.create_user(username=username)
db.session.add(new_user)
db.session.commit()
print(new_user)
# When trying to create a thread record using the user object I receive an error message,when entering the integer of the user ID the record is successfully created
@app.route('/thread/<string:post>')
def create_thread(post):
user = User.query.filter_by(id=1).first()
new_thread = Thread(title=post,user_id=user)
db.session.add(new_thread)
db.session.commit()
print(new_thread)
create_databse(app)
return app
def create_databse(app):
if os.path.isfile('database.db'):
print('Database already created.')
else:
db.create_all(app=app)
print('Database created.')
if __name__ == '__main__':
app = create_app()
app.run(debug=True)
要求.txt
autopep8==1.5.7
blinker==1.4
click==8.0.1
colorama==0.4.4
dnspython==2.1.0
email-validator==1.1.3
Flask==2.0.1
Flask-Login==0.5.0
Flask-Principal==0.4.0
Flask-Security-Too==4.1.0
Flask-sqlAlchemy==2.5.1
Flask-WTF==0.15.1
greenlet==1.1.0
idna==3.2
itsdangerous==2.0.1
Jinja2==3.0.1
MarkupSafe==2.0.1
passlib==1.7.4
pycodestyle==2.7.0
sqlAlchemy==1.4.22
toml==0.10.2
Werkzeug==2.0.1
WTForms==2.3.3
TIA
解决方法
您必须将用户 ID 放入 user_id 而不是用户对象
new_thread = Thread(title=post,user_id=user.id)
还有一个。您忘记在 Flask Security 的快速入门指南中将 fsqla.FsRoleMixin 和 fsqla.FsUserMixin 添加到您的模型角色和用户的父级 https://flask-security-too.readthedocs.io/en/stable/quickstart.html#basic-sqlalchemy-application