pallets-eco / flask-sqlalchemy

Adds SQLAlchemy support to Flask
https://flask-sqlalchemy.readthedocs.io
BSD 3-Clause "New" or "Revised" License
4.22k stars 899 forks source link

Example code on PiPy doesn't work #1011

Closed DavidTangye closed 2 years ago

DavidTangye commented 2 years ago

When I run it, I think the 'Simple Example' code at https://pypi.org/project/Flask-SQLAlchemy has two bugs:

  1. username -> user column mismatch?
  2. table does not exist (needs a create table (instantiate an object?) statement?

The error test output is:

/home/dt/.local/share/virtualenvs/dtcb-qw3rrlOv/lib/python3.8/site-packages/flask_sqlalchemy/__init__.py:872: FSADeprecationWarning: SQLALCHEMY_TRACK_MODIFICATIONS adds significant overhead and will be disabled by default in the future.  Set it to True or False to suppress this warning.
  warnings.warn(FSADeprecationWarning(
Traceback (most recent call last):
  File "/home/dt/.local/share/virtualenvs/dtcb-qw3rrlOv/lib/python3.8/site-packages/sqlalchemy/engine/base.py", line 1799, in _execute_context
    self.dialect.do_execute(
  File "/home/dt/.local/share/virtualenvs/dtcb-qw3rrlOv/lib/python3.8/site-packages/sqlalchemy/engine/default.py", line 717, in do_execute
    cursor.execute(statement, parameters)
sqlite3.OperationalError: no such table: user

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "test_sqla.py", line 14, in <module>
    db.session.commit()
  File "<string>", line 2, in commit
  File "/home/dt/.local/share/virtualenvs/dtcb-qw3rrlOv/lib/python3.8/site-packages/sqlalchemy/orm/session.py", line 1428, in commit
    self._transaction.commit(_to_root=self.future)
  File "/home/dt/.local/share/virtualenvs/dtcb-qw3rrlOv/lib/python3.8/site-packages/sqlalchemy/orm/session.py", line 829, in commit
    self._prepare_impl()
  File "/home/dt/.local/share/virtualenvs/dtcb-qw3rrlOv/lib/python3.8/site-packages/sqlalchemy/orm/session.py", line 808, in _prepare_impl
    self.session.flush()
  File "/home/dt/.local/share/virtualenvs/dtcb-qw3rrlOv/lib/python3.8/site-packages/sqlalchemy/orm/session.py", line 3340, in flush
    self._flush(objects)
  File "/home/dt/.local/share/virtualenvs/dtcb-qw3rrlOv/lib/python3.8/site-packages/sqlalchemy/orm/session.py", line 3480, in _flush
    transaction.rollback(_capture_exception=True)
  File "/home/dt/.local/share/virtualenvs/dtcb-qw3rrlOv/lib/python3.8/site-packages/sqlalchemy/util/langhelpers.py", line 70, in __exit__
    compat.raise_(
  File "/home/dt/.local/share/virtualenvs/dtcb-qw3rrlOv/lib/python3.8/site-packages/sqlalchemy/util/compat.py", line 207, in raise_
    raise exception
  File "/home/dt/.local/share/virtualenvs/dtcb-qw3rrlOv/lib/python3.8/site-packages/sqlalchemy/orm/session.py", line 3440, in _flush
    flush_context.execute()
  File "/home/dt/.local/share/virtualenvs/dtcb-qw3rrlOv/lib/python3.8/site-packages/sqlalchemy/orm/unitofwork.py", line 456, in execute
    rec.execute(self)
  File "/home/dt/.local/share/virtualenvs/dtcb-qw3rrlOv/lib/python3.8/site-packages/sqlalchemy/orm/unitofwork.py", line 630, in execute
    util.preloaded.orm_persistence.save_obj(
  File "/home/dt/.local/share/virtualenvs/dtcb-qw3rrlOv/lib/python3.8/site-packages/sqlalchemy/orm/persistence.py", line 244, in save_obj
    _emit_insert_statements(
  File "/home/dt/.local/share/virtualenvs/dtcb-qw3rrlOv/lib/python3.8/site-packages/sqlalchemy/orm/persistence.py", line 1221, in _emit_insert_statements
    result = connection._execute_20(
  File "/home/dt/.local/share/virtualenvs/dtcb-qw3rrlOv/lib/python3.8/site-packages/sqlalchemy/engine/base.py", line 1611, in _execute_20
    return meth(self, args_10style, kwargs_10style, execution_options)
  File "/home/dt/.local/share/virtualenvs/dtcb-qw3rrlOv/lib/python3.8/site-packages/sqlalchemy/sql/elements.py", line 325, in _execute_on_connection
    return connection._execute_clauseelement(
  File "/home/dt/.local/share/virtualenvs/dtcb-qw3rrlOv/lib/python3.8/site-packages/sqlalchemy/engine/base.py", line 1478, in _execute_clauseelement
    ret = self._execute_context(
  File "/home/dt/.local/share/virtualenvs/dtcb-qw3rrlOv/lib/python3.8/site-packages/sqlalchemy/engine/base.py", line 1842, in _execute_context
    self._handle_dbapi_exception(
  File "/home/dt/.local/share/virtualenvs/dtcb-qw3rrlOv/lib/python3.8/site-packages/sqlalchemy/engine/base.py", line 2023, in _handle_dbapi_exception
    util.raise_(
  File "/home/dt/.local/share/virtualenvs/dtcb-qw3rrlOv/lib/python3.8/site-packages/sqlalchemy/util/compat.py", line 207, in raise_
    raise exception
  File "/home/dt/.local/share/virtualenvs/dtcb-qw3rrlOv/lib/python3.8/site-packages/sqlalchemy/engine/base.py", line 1799, in _execute_context
    self.dialect.do_execute(
  File "/home/dt/.local/share/virtualenvs/dtcb-qw3rrlOv/lib/python3.8/site-packages/sqlalchemy/engine/default.py", line 717, in do_execute
    cursor.execute(statement, parameters)
sqlalchemy.exc.OperationalError: (sqlite3.OperationalError) no such table: user
[SQL: INSERT INTO user (username, email) VALUES (?, ?)]
[parameters: ('Freddy_Flask', 'example@example.com')]
(Background on this error at: https://sqlalche.me/e/14/e3q8)
davidism commented 2 years ago

You need to call db.create_all(), but I didn't want to put that in the example because you really don't want to do that unconditionally and should be using Alembic to migrate your DB instead. There does not appear to be an typos though. The example is meant to show what using the library looks like, not to teach you how to use the library. Check the full documentation for a full guide.