我有一个问题的瓶-安全-太和SQLAlchemy。在下面的示例中,我可以创建一个用户,一旦创建了用户,我想创建一个线程,具有一对多的关系。当我将用户对象传递给查询时,我会收到以下错误消息;
sqlalchemy.exc.InterfaceError:(sqlite3.InterfaceError)错误绑定参数1--可能不支持类型。SQL:插入线程(title,user_id)值(?,?)(有关此错误的背景信息:https://sqlalche.me/e/14/rvf5)
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.Integer(), 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), unique=True, 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)requirements.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提亚
发布于 2021-07-28 09:36:08
必须将用户id放在user_id中而不是用户对象中。
new_thread = Thread(title=post, user_id=user.id)再来一个。您忘了将fsqla.FsRoleMixin和fsqla.FsUserMixin添加到您的父母、角色和用户中,比如在https://flask-security-too.readthedocs.io/en/stable/quickstart.html#basic-sqlalchemy-application的快速启动指南中
https://stackoverflow.com/questions/68528753
复制相似问题