Просмотр исходного кода

Use db.create_all to create the initial db

Peter Justin 7 лет назад
Родитель
Сommit
2ee1b60d22
3 измененных файлов с 35 добавлено и 8 удалено
  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 flask import current_app
 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 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,
                                     create_default_groups,
                                     create_default_settings, insert_bulk_data,
-                                    update_settings_from_fixture)
+                                    update_settings_from_fixture,
+                                    create_latest_db)
 from flaskbb.utils.translations import compile_translations
 
 
@@ -120,8 +120,9 @@ def install(welcome, force, username, email, password):
             drop_database(db.engine.url)
         else:
             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")
     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
         if not initdb:
-            alembic.upgrade()
+            create_latest_db()
 
     if initdb:
         click.secho("[+] Initializing database...", fg="cyan")
-        alembic.upgrade()
+        create_latest_db()
 
     if test_data:
         click.secho("[+] Adding some test data...", fg="cyan")

+ 15 - 1
flaskbb/utils/populate.py

@@ -10,10 +10,13 @@
 """
 from __future__ import unicode_literals
 import collections
+
+from sqlalchemy_utils.functions import create_database
+
 from flaskbb.management.models import Setting, SettingsGroup
 from flaskbb.user.models import User, Group
 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):
@@ -374,3 +377,14 @@ def insert_bulk_data(topic_count=10, post_count=100):
     user2.recalculate()
 
     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, \
     create_settings_from_fixture, update_settings_from_fixture, \
     create_default_groups, create_test_data, insert_bulk_data, \
@@ -236,3 +240,11 @@ def test_create_default_groups(database):
 
         for attribute, value in attributes.items():
             assert getattr(group, attribute) == value
+
+
+def test_migrations_upgrade():
+    with pytest.raises(OperationalError):
+        User.query.all()
+
+    alembic.upgrade()
+    assert len(User.query.all()) == 0