From acac07cd8e1c8a46ce4d91e9557e916ee70e410a Mon Sep 17 00:00:00 2001 From: Becky Date: Mon, 10 Jun 2019 16:39:34 +0100 Subject: [PATCH 1/7] Added some table support --- sqlalchemy_seed/__init__.py | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/sqlalchemy_seed/__init__.py b/sqlalchemy_seed/__init__.py index 9dd3aae..436a1f0 100644 --- a/sqlalchemy_seed/__init__.py +++ b/sqlalchemy_seed/__init__.py @@ -90,6 +90,20 @@ def _create_model_instance(fixture): return instances +def _create_table_object_data(fixture): + """Create a Table object entry. + + :param fixture: Fixtures + """ + for data in fixture: + if 'table' in data: + module_name, class_name = data['table'].rsplit('.', 1) + module = importlib.import_module(module_name) + table = db.metadata.tables[class_name] + insert = table.insert() + session.execute(insert.values(**data['fields'])) + + def load_fixtures(session, fixtures): """Load fixture. @@ -99,6 +113,7 @@ def load_fixtures(session, fixtures): instances = [] for fixture in fixtures: _instances = _create_model_instance(fixture) + _create_table_object_data(fixture) for instance in _instances: instances.append(instance) From 2d86448a27d51bf334a15ee6d7cb6c13ecb7822a Mon Sep 17 00:00:00 2001 From: Becky Date: Tue, 11 Jun 2019 09:18:18 +0100 Subject: [PATCH 2/7] Adding into tests --- sqlalchemy_seed/__init__.py | 9 ++++-- tests/fixtures/picture_categories.yaml | 9 ++++++ tests/fixtures/picture_category_picture.yaml | 12 ++++++++ tests/test_sqlalchey_seed.py | 30 ++++++++++++++++++-- 4 files changed, 55 insertions(+), 5 deletions(-) create mode 100644 tests/fixtures/picture_categories.yaml create mode 100644 tests/fixtures/picture_category_picture.yaml diff --git a/sqlalchemy_seed/__init__.py b/sqlalchemy_seed/__init__.py index 436a1f0..f5f1b0e 100644 --- a/sqlalchemy_seed/__init__.py +++ b/sqlalchemy_seed/__init__.py @@ -13,6 +13,8 @@ import json import os +from sqlalchemy import MetaData + import yaml try: from yaml import CLoader as Loader @@ -90,7 +92,7 @@ def _create_model_instance(fixture): return instances -def _create_table_object_data(fixture): +def _create_table_object_data(fixture, session): """Create a Table object entry. :param fixture: Fixtures @@ -99,7 +101,8 @@ def _create_table_object_data(fixture): if 'table' in data: module_name, class_name = data['table'].rsplit('.', 1) module = importlib.import_module(module_name) - table = db.metadata.tables[class_name] + metadata = MetaData(session.get_bind(), reflect=True) + table = metadata.tables[class_name] insert = table.insert() session.execute(insert.values(**data['fields'])) @@ -113,7 +116,7 @@ def load_fixtures(session, fixtures): instances = [] for fixture in fixtures: _instances = _create_model_instance(fixture) - _create_table_object_data(fixture) + _create_table_object_data(fixture, session) for instance in _instances: instances.append(instance) diff --git a/tests/fixtures/picture_categories.yaml b/tests/fixtures/picture_categories.yaml new file mode 100644 index 0000000..5cd7472 --- /dev/null +++ b/tests/fixtures/picture_categories.yaml @@ -0,0 +1,9 @@ +- model: tests.test_sqlalchey_seed.PictureCategory + id: 1 + fields: + name: Category1 +- model: tests.test_sqlalchey_seed.PictureCategory + id: 2 + fields: + name: Category2 + diff --git a/tests/fixtures/picture_category_picture.yaml b/tests/fixtures/picture_category_picture.yaml new file mode 100644 index 0000000..02ec2cc --- /dev/null +++ b/tests/fixtures/picture_category_picture.yaml @@ -0,0 +1,12 @@ +- table: tests.test_sqlalchey_seed.picture_category_picture + id: 1 + fields: + picture_id: 1 + picture_category_id: 1 + +- table: tests.test_sqlalchey_seed.picture_category_picture + id: 2 + fields: + picture_id: 1 + picture_category_id: 2 + diff --git a/tests/test_sqlalchey_seed.py b/tests/test_sqlalchey_seed.py index b1d08fd..cb80d53 100644 --- a/tests/test_sqlalchey_seed.py +++ b/tests/test_sqlalchey_seed.py @@ -13,7 +13,7 @@ import os from unittest import TestCase -from sqlalchemy import Column, create_engine, ForeignKey, Integer, String +from sqlalchemy import Column, create_engine, ForeignKey, Integer, String, Table from sqlalchemy.exc import OperationalError from sqlalchemy.ext.declarative import declarative_base from sqlalchemy.orm import relationship, scoped_session, sessionmaker @@ -75,6 +75,28 @@ def __repr__(self): ) +class PictureCategory(Base): + __tablename__ = 'picture_category' + + id = Column(Integer, primary_key=True) + name = Column(String(120)) + + def __repr__(self): + """Repr.""" + return 'PictureCategory(id={0}, name={1})'.format( + self.id, + self.name, + ) + + +picture_category_picture = Table( + 'picture_category_picture', + Base.metadata, + Column('picture_id', Integer, ForeignKey('pictures.id')), + Column('picture_category_id', Integer, ForeignKey('picture_category.id')), +) + + class TestFixtures(TestCase): path = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'fixtures') @@ -105,13 +127,17 @@ def test_load_fixture(self): def test_load_fixtures(self): create_table(Base) fixtures = load_fixture_files( - self.path, ['accounts.yaml', 'pictures.yaml'], + self.path, ['accounts.yaml', 'pictures.yaml', 'picture_categories.yaml', 'picture_category_picture.yaml'], ) load_fixtures(session, fixtures) accounts = session.query(Account).all() self.assertEqual(len(accounts), 2) pictures = session.query(Picture).all() self.assertEqual(len(pictures), 4) + picture_categories = session.query(PictureCategory).all() + self.assertEqual(len(picture_categories), 2) + category_rels = session.query(picture_category_picture).all() + self.assertEqual(len(category_rels), 2) drop_table(Base, session) From b49ba59e86ac7bec6008ddc5b2a1f2c28ff9b058 Mon Sep 17 00:00:00 2001 From: Becky Lewis Date: Sun, 23 Jun 2019 17:59:20 +0100 Subject: [PATCH 3/7] Moved import --- sqlalchemy_seed/__init__.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/sqlalchemy_seed/__init__.py b/sqlalchemy_seed/__init__.py index f5f1b0e..91eec0c 100644 --- a/sqlalchemy_seed/__init__.py +++ b/sqlalchemy_seed/__init__.py @@ -13,9 +13,10 @@ import json import os +import yaml + from sqlalchemy import MetaData -import yaml try: from yaml import CLoader as Loader except ImportError: From 5a903b5ae63e04917767f848ad210c7a8b028fd1 Mon Sep 17 00:00:00 2001 From: Becky Lewis Date: Sun, 23 Jun 2019 17:59:53 +0100 Subject: [PATCH 4/7] Moved import --- sqlalchemy_seed/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sqlalchemy_seed/__init__.py b/sqlalchemy_seed/__init__.py index 91eec0c..558d977 100644 --- a/sqlalchemy_seed/__init__.py +++ b/sqlalchemy_seed/__init__.py @@ -101,7 +101,7 @@ def _create_table_object_data(fixture, session): for data in fixture: if 'table' in data: module_name, class_name = data['table'].rsplit('.', 1) - module = importlib.import_module(module_name) + importlib.import_module(module_name) metadata = MetaData(session.get_bind(), reflect=True) table = metadata.tables[class_name] insert = table.insert() From 372ef2b778aef1e2793c6b135d8914e3ef4337b5 Mon Sep 17 00:00:00 2001 From: Becky Lewis Date: Sun, 23 Jun 2019 18:01:30 +0100 Subject: [PATCH 5/7] Linting --- sqlalchemy_seed/__init__.py | 1 - 1 file changed, 1 deletion(-) diff --git a/sqlalchemy_seed/__init__.py b/sqlalchemy_seed/__init__.py index 558d977..c646cd7 100644 --- a/sqlalchemy_seed/__init__.py +++ b/sqlalchemy_seed/__init__.py @@ -14,7 +14,6 @@ import os import yaml - from sqlalchemy import MetaData try: From ce7cc5fb4c75ab484f09f879fcd9e58636a6f595 Mon Sep 17 00:00:00 2001 From: Becky Lewis Date: Sun, 23 Jun 2019 18:16:31 +0100 Subject: [PATCH 6/7] Attempt to resolve deprecation warning --- sqlalchemy_seed/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sqlalchemy_seed/__init__.py b/sqlalchemy_seed/__init__.py index c646cd7..9fcdf54 100644 --- a/sqlalchemy_seed/__init__.py +++ b/sqlalchemy_seed/__init__.py @@ -101,7 +101,7 @@ def _create_table_object_data(fixture, session): if 'table' in data: module_name, class_name = data['table'].rsplit('.', 1) importlib.import_module(module_name) - metadata = MetaData(session.get_bind(), reflect=True) + metadata = MetaData(session.get_bind()).reflect() table = metadata.tables[class_name] insert = table.insert() session.execute(insert.values(**data['fields'])) From 8e908ff5f5cc9a2b07de860d604ff8d98ec8b712 Mon Sep 17 00:00:00 2001 From: Becky Lewis Date: Sun, 23 Jun 2019 18:22:04 +0100 Subject: [PATCH 7/7] Attempt to resolve deprecation warning --- sqlalchemy_seed/__init__.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/sqlalchemy_seed/__init__.py b/sqlalchemy_seed/__init__.py index 9fcdf54..7ccb57b 100644 --- a/sqlalchemy_seed/__init__.py +++ b/sqlalchemy_seed/__init__.py @@ -101,7 +101,8 @@ def _create_table_object_data(fixture, session): if 'table' in data: module_name, class_name = data['table'].rsplit('.', 1) importlib.import_module(module_name) - metadata = MetaData(session.get_bind()).reflect() + metadata = MetaData() + metadata.reflect(bind=session.get_bind()) table = metadata.tables[class_name] insert = table.insert() session.execute(insert.values(**data['fields']))