title: AttributeError: can't set attribute when connecting to sqlite database with flask-sqlalchemy
body: <p>I've been learning the flask web application framework and feel quite comfortable with it. I've previously built a simple to do app that worked perfectly. I was working on the same project, but trying to implement it using TDD. I've encountered an error with the database that I've never seen before and don't know how to fix.</p>
  <p>When I examine my code, I cant see any issue. It also looks identical to the code of the working project, so I really don't know what I am doing wrong.</p>
  <p>Here is the errors:</p>
  <pre><code>(env) PS C:\coding-projects\task-master-tdd&gt; flask shell
  Python 3.8.5 (tags/v3.8.5:580fbb0, Jul 20 2020, 15:43:08) [MSC v.1926 32 bit (Intel)] on win32
  App: project [development]
  Instance: C:\coding-projects\task-master-tdd\instance
  &gt;&gt;&gt; from project import db
  &gt;&gt;&gt; db
  Traceback (most recent call last):
    File &quot;&lt;console&gt;&quot;, line 1, in &lt;module&gt;
    File &quot;c:\coding-projects\task-master-tdd\env\lib\site-packages\flask_sqlalchemy\__init__.py&quot;, line 1060, in __repr__
      self.engine.url if self.app or current_app else None
    File &quot;c:\coding-projects\task-master-tdd\env\lib\site-packages\flask_sqlalchemy\__init__.py&quot;, line 943, in engine
      return self.get_engine()
    File &quot;c:\coding-projects\task-master-tdd\env\lib\site-packages\flask_sqlalchemy\__init__.py&quot;, line 962, in get_engine
      return connector.get_engine()
    File &quot;c:\coding-projects\task-master-tdd\env\lib\site-packages\flask_sqlalchemy\__init__.py&quot;, line 555, in get_engine
      options = self.get_options(sa_url, echo)
    File &quot;c:\coding-projects\task-master-tdd\env\lib\site-packages\flask_sqlalchemy\__init__.py&quot;, line 570, in get_options
      self._sa.apply_driver_hacks(self._app, sa_url, options)
    File &quot;c:\coding-projects\task-master-tdd\env\lib\site-packages\flask_sqlalchemy\__init__.py&quot;, line 914, in apply_driver_hacks
      sa_url.database = os.path.join(app.root_path, sa_url.database)
  AttributeError: can't set attribute
  &gt;&gt;&gt;
  </code></pre>
  <p>my config.py file:</p>
  <pre><code>import os
  
  # load the environment variables from the .env file
  from dotenv import load_dotenv
  load_dotenv()
  
  # Determine the folder of the top-level directory of this project
  BASEDIR = os.path.abspath(os.path.dirname(__file__))
  
  
  class Config:
      FLASK_ENV = 'development'
      TESTING = False
      DEBUG = False
      SECRET_KEY = os.getenv('SECRET_KEY', default='A very terrible secret key.')
      SQLALCHEMY_DATABASE_URI = os.getenv('DATABASE_URL',
                                          default=f&quot;sqlite:///{os.path.join(BASEDIR, 'instance', 'app.db')}&quot;)
      SQLALCHEMY_TRACK_MODIFICATIONS = False
  
  class DevelopmentConfig(Config):
      DEBUG = True
  
  class TestingConfig(Config):
      TESTING = True
      SQLALCHEMY_DATABASE_URI = os.getenv('DATABASE_URL',
                                          default=f&quot;sqlite:///{os.path.join(BASEDIR, 'instance', 'test.db')}&quot;)
  
  class ProductionConfig(Config):
      FLASK_ENV = 'production'
  </code></pre>
  <p>my user model:</p>
  <pre><code>from project import db, login_manager
  from flask_login import UserMixin
  from werkzeug.security import generate_password_hash, check_password_hash
  
  class User(db.Model, UserMixin):
      __tablename__ = 'users'
  
      id = db.Column(db.Integer, primary_key=True)
      username = db.Column(db.String, unique=True)
      hashed_password = db.Column(db.String)
  
      def __init__(self, username, password):
          self.username = username
          self.hashed_password = generate_password_hash(password)
  
      def is_password_valid(self, password):
          return check_password_hash(self.hashed_password, password)
  
      def __repr__(self):
          return '&lt;User {}&gt;'.format(self.id)
  
  @login_manager.user_loader
  def load_user(user_id):
      return User.query.get(int(user_id))
  </code></pre>