From b6b92980c00eda14a4d759b724139a0a2d321007 Mon Sep 17 00:00:00 2001 From: Simon Willison Date: Sat, 3 Aug 2019 20:51:22 +0300 Subject: [PATCH] table.m2m(..., m2m_table=x) argument --- sqlite_utils/db.py | 9 +++++---- tests/test_m2m.py | 11 ++++++++--- 2 files changed, 13 insertions(+), 7 deletions(-) diff --git a/sqlite_utils/db.py b/sqlite_utils/db.py index e759910..fdc4a99 100644 --- a/sqlite_utils/db.py +++ b/sqlite_utils/db.py @@ -1048,7 +1048,9 @@ class Table: self.create_index(column_values.keys(), unique=True) return pk - def m2m(self, other_table, record_or_list=None, pk=None, lookup=None): + def m2m( + self, other_table, record_or_list=None, pk=None, lookup=None, m2m_table=None + ): our_id = self.last_pk if lookup is not None: assert record_or_list is None, "Provide lookup= or record, not both" @@ -1056,9 +1058,8 @@ class Table: assert record_or_list is not None, "Provide lookup= or record, not both" tables = list(sorted([self.name, other_table])) columns = ["{}_id".format(t) for t in tables] - m2m_table = self.db.table( - "{}_{}".format(*tables), pk=columns, foreign_keys=columns - ) + m2m_table_name = m2m_table or "{}_{}".format(*tables) + m2m_table = self.db.table(m2m_table_name, pk=columns, foreign_keys=columns) if lookup is None: records = ( [record_or_list] diff --git a/tests/test_m2m.py b/tests/test_m2m.py index 471166e..10a3d50 100644 --- a/tests/test_m2m.py +++ b/tests/test_m2m.py @@ -74,9 +74,14 @@ def test_m2m_requires_either_records_or_lookup(fresh_db): people.m2m("tags", {"tag": "hello"}, lookup={"foo": "bar"}) -def test_m2m_explicit_argument(fresh_db): - # .m2m("humans", ..., m2m_table="relationships") - assert False +def test_m2m_explicit_table_name_argument(fresh_db): + people = fresh_db.table("people", pk="id") + people.insert({"name": "Wahyu"}).m2m( + "tags", lookup={"tag": "Coworker"}, m2m_table="tagged" + ) + assert fresh_db["tags"].exists + assert fresh_db["tagged"].exists + assert not fresh_db["people_tags"].exists def test_uses_existing_m2m_table_if_exists(fresh_db):