Массовое сохранение объектов SQLAlchemy для второй таблицы создает избыточные идентификаторы - PullRequest
0 голосов
/ 04 августа 2020

Таблица:

class Person(Base):
    __tablename__ = 'person'

    id = Column('id', Integer, primary_key=True)
    gender = Column(String)
    name = relationship("Name", uselist=False, back_populates="person")
    location = relationship("Location", uselist=False, back_populates="person")
    email = Column(String)
    login = relationship("Login", uselist=False, back_populates="person")
    dob = relationship("Dob", uselist=False, back_populates="person")
    registered = relationship("Registered", uselist=False, back_populates="person")
    phone = Column(String)
    cell = Column(String)
    id_person = relationship("IdPerson", uselist=False, back_populates="person")
    nat = Column(String)

    def __repr__(self):
        return f'(id:{self.id}, gender:{self.name})'


У меня есть JSON файл, содержащий 1000 строк данные о людях (и двойные и тройные вложенные «таблицы»).

I создал функцию, которая создает списки, например. пол из файла JSON. Я создал функцию, которая вставляет данные из этого списка в db.

def bulk_save_obj_gender():
    index = 0
    persons_gender = []
    for element in range(count_indexes()):
        per = Person(gender=all_genders[index])
        persons_gender.append(per)
        index += 1

    session.bulk_save_objects(persons_gender, return_defaults=True)
    for gender in persons_gender:
        assert gender.id is not None
    session.add_all(persons_gender)
    session.commit()

def bulk_save_obj_email():
    index = 0
    persons_emails = []
    for element in range(count_indexes()):
        per = Person(email=all_emails[index])
        persons_emails.append(per)
        index += 1

    session.bulk_save_objects(persons_emails, return_defaults=True)
     for email in persons_emails:
         assert email.id is not None
    session.add_all(persons_emails)
    session.commit()

, и что я вижу в * .db, так это то, что у меня есть 1-1000 идентификаторов полов (и столбец электронных писем NULL) и 1001 -2000 идентификаторов писем.

Интересно, как создать функцию, которая вставляет эти письма в существующий идентификатор от 1 до 2000. Чтобы связать пол и электронные письма по их идентификатору.

Я не конечно, я могу это хорошо описать.

screenshot-of-db

Когда я изменил код на простой SQL запрос, он отлично работает:

def populate_data_using_sqlite_query():
    conn = sqlite3.connect('persons.db')
    c = conn.cursor()
    for i in range(count_indexes()):
        gend = all_genders[i]
        email = all_emails[i]
        params = (i, gend, email)
        c.execute("INSERT INTO person (id, gender, email) VALUES (?,?,?)", params)
    conn.commit()


populate_data_using_sqlite_query()

но я действительно хочу сделать это с помощью ORM.

Пожалуйста, помогите :)

1 Ответ

0 голосов
/ 04 августа 2020

Вы можете сделать что-то подобное, чтобы избежать пустых столбцов электронной почты и убедиться, что они сопоставлены с полом.

def bulk_save_persons():
    index = 0
    persons = []
    for element in range(count_indexes()):
        person = Person(gender=all_genders[index], email=all_emails[index])
        persons.append(person)
        index += 1

    session.add_all(persons)
    session.commit()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...