Browse Source

Use db.create_all to create the initial db

Peter Justin 7 years ago
parent
commit
e5f62b411b
3 changed files with 35 additions and 8 deletions
  1. 8 7
      flaskbb/cli/main.py
  2. 15 1
      flaskbb/utils/populate.py
  3. 12 0
      tests/unit/utils/test_populate.py

+ 8 - 7
flaskbb/cli/main.py

@@ -20,8 +20,7 @@ from werkzeug.utils import import_string, ImportStringError
 from jinja2 import Environment, FileSystemLoader
 from jinja2 import Environment, FileSystemLoader
 from flask import current_app
 from flask import current_app
 from flask.cli import FlaskGroup, ScriptInfo, with_appcontext
 from flask.cli import FlaskGroup, ScriptInfo, with_appcontext
-from sqlalchemy_utils.functions import (database_exists, create_database,
-                                        drop_database)
+from sqlalchemy_utils.functions import database_exists, drop_database
 from flask_alembic import alembic_click
 from flask_alembic import alembic_click
 
 
 from flaskbb import create_app
 from flaskbb import create_app
@@ -33,7 +32,8 @@ from flaskbb.cli.utils import (prompt_save_user, prompt_config_path,
 from flaskbb.utils.populate import (create_test_data, create_welcome_forum,
 from flaskbb.utils.populate import (create_test_data, create_welcome_forum,
                                     create_default_groups,
                                     create_default_groups,
                                     create_default_settings, insert_bulk_data,
                                     create_default_settings, insert_bulk_data,
-                                    update_settings_from_fixture)
+                                    update_settings_from_fixture,
+                                    create_latest_db)
 from flaskbb.utils.translations import compile_translations
 from flaskbb.utils.translations import compile_translations
 
 
 
 
@@ -120,8 +120,9 @@ def install(welcome, force, username, email, password):
             drop_database(db.engine.url)
             drop_database(db.engine.url)
         else:
         else:
             sys.exit(0)
             sys.exit(0)
-    create_database(db.engine.url)
-    alembic.upgrade()
+
+    # creating database from scratch and 'stamping it'
+    create_latest_db()
 
 
     click.secho("[+] Creating default settings...", fg="cyan")
     click.secho("[+] Creating default settings...", fg="cyan")
     create_default_groups()
     create_default_groups()
@@ -162,11 +163,11 @@ def populate(bulk_data, test_data, posts, topics, force, initdb):
 
 
         # do not initialize the db if -i is passed
         # do not initialize the db if -i is passed
         if not initdb:
         if not initdb:
-            alembic.upgrade()
+            create_latest_db()
 
 
     if initdb:
     if initdb:
         click.secho("[+] Initializing database...", fg="cyan")
         click.secho("[+] Initializing database...", fg="cyan")
-        alembic.upgrade()
+        create_latest_db()
 
 
     if test_data:
     if test_data:
         click.secho("[+] Adding some test data...", fg="cyan")
         click.secho("[+] Adding some test data...", fg="cyan")

+ 15 - 1
flaskbb/utils/populate.py

@@ -9,10 +9,13 @@
     :license: BSD, see LICENSE for more details.
     :license: BSD, see LICENSE for more details.
 """
 """
 from __future__ import unicode_literals
 from __future__ import unicode_literals
+
+from sqlalchemy_utils.functions import create_database
+
 from flaskbb.management.models import Setting, SettingsGroup
 from flaskbb.management.models import Setting, SettingsGroup
 from flaskbb.user.models import User, Group
 from flaskbb.user.models import User, Group
 from flaskbb.forum.models import Post, Topic, Forum, Category
 from flaskbb.forum.models import Post, Topic, Forum, Category
-from flaskbb.extensions import db
+from flaskbb.extensions import alembic, db
 
 
 
 
 def delete_settings_from_fixture(fixture):
 def delete_settings_from_fixture(fixture):
@@ -365,3 +368,14 @@ def insert_bulk_data(topic_count=10, post_count=100):
     user2.recalculate()
     user2.recalculate()
 
 
     return created_topics, created_posts
     return created_topics, created_posts
+
+
+def create_latest_db():
+    """Creates the database including the schema using SQLAlchemy's
+    db.create_all method instead of going through all the database revisions.
+    The revision will be set to 'head' which indicates the latest alembic
+    revision.
+    """
+    create_database(db.engine.url)
+    db.create_all()
+    alembic.stamp()

+ 12 - 0
tests/unit/utils/test_populate.py

@@ -1,3 +1,7 @@
+import pytest
+from sqlalchemy.exc import OperationalError
+
+from flaskbb.extensions import alembic, db
 from flaskbb.utils.populate import delete_settings_from_fixture, \
 from flaskbb.utils.populate import delete_settings_from_fixture, \
     create_settings_from_fixture, update_settings_from_fixture, \
     create_settings_from_fixture, update_settings_from_fixture, \
     create_default_groups, create_test_data, insert_bulk_data, \
     create_default_groups, create_test_data, insert_bulk_data, \
@@ -119,3 +123,11 @@ def test_create_default_groups(database):
 
 
         for attribute, value in attributes.items():
         for attribute, value in attributes.items():
             assert getattr(group, attribute) == value
             assert getattr(group, attribute) == value
+
+
+def test_migrations_upgrade():
+    with pytest.raises(OperationalError):
+        User.query.all()
+
+    alembic.upgrade()
+    assert len(User.query.all()) == 0