I have two tables created with Flask-SQLAlchemy below - they have a one to one relationship.
class Logo(db.Model):
__tablename__ = "logo"
id = db.Column(db.Integer, primary_key=True)
filename = db.Column(db.String(100))
data = db.Column(db.LargeBinary)
username = db.Column(db.String(100), db.ForeignKey("users.username"))
users = db.relationship("User", backref=backref("logo", uselist=False))
def __init__(self, filename: str, data, username: str):
self.filename = filename
self.data = data
self.username = username
def __repr__(self) -> str:
return "<Logo (filename='{}', username='{}')>".format(
self.filename, self.username
)
class User(UserMixin, db.Model):
__tablename__ = "users"
id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String(100), unique=True)
password = db.Column(
db.String(200), primary_key=False, unique=False, nullable=False
)
is_admin = db.Column(db.Boolean, default=False, nullable=True)
def __init__(
self,
username: str,
password: str,
is_admin: bool = False,
):
self.username = username
self.password = self.set_password(password)
self.is_admin = is_admin
def get_id(self):
return self.username
def set_password(self, password: str) -> str:
return generate_password_hash(password, method="sha256")
def check_password(self, password: str):
return check_password_hash(self.password, password)
def __repr__(self) -> str:
return "<User {}>".format(self.username)
I would like to update the user table in a case when the user would like to have a new username:
user01 = User.query.filter_by(username="user01").first()
logo = Logo.query.filter_by(username="user01").first()
new_username= "newusertest"
user01.username = new_username
logo.users = user01
logo.username = new_username
db.session.add(user01)
db.session.add(logo)
db.session.commit()
The db.session.commit throws the following error:
IntegrityError: (psycopg2.errors.ForeignKeyViolation) update or delete on table "users" violates foreign key constraint "logo_username_fkey" on table "logo"
DETAIL: Key (username)=(user01) is still referenced from table "logo".
[SQL: UPDATE users SET username=%(username)s WHERE users.id = %(users_id)s]
[parameters: {'username': 'newusertest', 'users_id': 2}]
(Background on this error at: https://sqlalche.me/e/14/gkpj)
The error says the logo table still has the old username but I have updated it and I don't know why that shows up again, I have spent the last 2 hours debugging and trying different stuff but nothing works.