From 0193ba04d5010593dcd3aa90f56eef08c5299170 Mon Sep 17 00:00:00 2001 From: Adam Wolf Date: Mon, 26 Oct 2020 13:36:50 -0500 Subject: [PATCH] Allow iterables other than Lists in m2m records --- sqlite_utils/db.py | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/sqlite_utils/db.py b/sqlite_utils/db.py index af5bb97..0a16380 100644 --- a/sqlite_utils/db.py +++ b/sqlite_utils/db.py @@ -1,5 +1,6 @@ from .utils import sqlite3, OperationalError, suggest_column_types, column_affinity from collections import namedtuple, OrderedDict +from collections.abc import Mapping import contextlib import datetime import decimal @@ -1772,15 +1773,15 @@ class Table(Queryable): return pk def m2m( - self, other_table, record_or_list=None, pk=DEFAULT, lookup=None, m2m_table=None + self, other_table, record_or_iterable=None, pk=DEFAULT, lookup=None, m2m_table=None ): if isinstance(other_table, str): other_table = self.db.table(other_table, pk=pk) our_id = self.last_pk if lookup is not None: - assert record_or_list is None, "Provide lookup= or record, not both" + assert record_or_iterable is None, "Provide lookup= or record, not both" else: - assert record_or_list is not None, "Provide lookup= or record, not both" + assert record_or_iterable is not None, "Provide lookup= or record, not both" tables = list(sorted([self.name, other_table.name])) columns = ["{}_id".format(t) for t in tables] if m2m_table is not None: @@ -1801,10 +1802,11 @@ class Table(Queryable): 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: + # if records is only one record, put the record in a list records = ( - [record_or_list] - if not isinstance(record_or_list, (list, tuple)) - else record_or_list + [record_or_iterable] + if isinstance(record_or_iterable, Mapping) + else record_or_iterable ) # Ensure each record exists in other table for record in records: