Home > OS >  Commit session comman throing an error in sqlite
Commit session comman throing an error in sqlite

Time:10-24

my flask app is throwing an error when i use db.commit.session(), I don't see where i faulter in my code this is the code in the terminal and the error:

>>> user_1 = User(username='Corey', email='C@demo.com', password='password')
>>> db.session.add(user_1)
>>> user_2 = User(username='JohnDoe', email='jd@demo.com', password='password')
>>> db.session.add(user_2)
>>> db.create_all()
>>> db.session.commit()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<string>", line 2, in commit
  File "C:\Users\hp\miniconda3\lib\site-packages\sqlalchemy\orm\session.py", line 1428, in commit
    self._transaction.commit(_to_root=self.future)
  File "C:\Users\hp\miniconda3\lib\site-packages\sqlalchemy\orm\session.py", line 827, in commit
    self._assert_active(prepared_ok=True)
  File "C:\Users\hp\miniconda3\lib\site-packages\sqlalchemy\orm\session.py", line 608, in _assert_active
    code="7s2a",
sqlalchemy.exc.PendingRollbackError: This Session's transaction has been rolled back due to a previous exception during flush. To begin a new transaction with this Session, first issue Session.rollback(). Original exception was: (sqlite3.IntegrityError) UNIQUE constraint failed: user.image_file
[SQL: INSERT INTO user (username, email, image_file, password) VALUES (?, ?, ?, ?)]
[parameters: ('JohnDoe', 'jd@demo.com', 'default.jpg', 'password')]
(Background on this error at: https://sqlalche.me/e/14/gkpj) (Background on this error at: https://sqlalche.me/e/14/7s2a)

Honestly I don't know if it's my code from the terminal or my main code, I'm following a tutorial ,Corey Schafer and i am pretty sure this is the same step he took but mine is throing an error This is my code from my app

from datetime import datetime
from flask import Flask, render_template, url_for, flash, redirect
from flask_sqlalchemy import SQLAlchemy
from forms import RegistrationForm, LoginForm
 
app = Flask(__name__)
app.config['SECRET_KEY'] = 'cac78a5498388aa4a95fb2be0f0a6499'
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///site.db'
db = SQLAlchemy(app)

class User(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(20), unique=True, nullable=False)
    email = db.Column(db.String(120), unique=True, nullable=False)
    image_file = db.Column(db.String(20), unique=True, default='default.jpg')
    password = db.Column(db.String(60), nullable=False)
    posts = db.relationship('Post', backref="author", lazy=True)

    def __repr__(self):
        return f"User('{self.username}','{self.email}','{self.image_file}')"

class Post(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    title = db.Column(db.String(100), nullable=False)
    date_posted = db.Column(db.DateTime, nullable=False, default=datetime.utcnow)
    content = db.Column(db.Text, nullable=False)
    user_id = db.Column(db.Integer, db.ForeignKey('user.id'), nullable=False)

    def __repr__(self):
        return f"Post('{self.title}','{self.date_posted}')"

Please someone should help me ,thanks a lot

CodePudding user response:

The problem is that you are defining the user model's column image_file as 'unique' when you specify unique=True. This then throws an error when you create a new user(without specifying an image_file), because the default image_file is always 'default.jpg'. Basically, you will just need to remove the unique=True attribute in the image_file column, as new users will (by default) have the same image file.

  • Related