TypeError при вставке нескольких экземпляров в базу данных с использованием SQLAlchemy - PullRequest
0 голосов
/ 13 июня 2018

Итак, я получаю список, содержащий информацию о сотрудниках, и хочу записать его в базу данных.SQLAlchemy documuntation говорит, что теперь это правильно, но БД все еще пуста.База данных была создана правильно, как теперь я могу вставить данные из списка employee_list в базу данных?

Мой код

from PyBambooHR import PyBambooHR
import sqlalchemy
from sqlalchemy import Column, Integer, String
from sqlalchemy.ext.declarative import declarative_base
import pprint


Base = declarative_base()


class EmployeeData(Base):

    __tablename__ = 'employee_data'
    id = Column(Integer, primary_key=True)
    name = Column(String(120))
    department = Column(String(120))
    jobTitle = Column(String(120))
    email = Column(String(120))


engine = sqlalchemy.create_engine('sqlite:///employee_db.db')

connection = engine.connect()


Base.metadata.create_all(engine)

bamboo = PyBambooHR(subdomain='company', api_key='key')


employees = bamboo.get_employee_directory()
employees_list = [[item['displayName'], item['department'], item['jobTitle'], item['workEmail']] for item in employees]


employees_list.sort()

connection.execute(employees_list.insert())

connection.close()

pprint.pprint(employees_list)

вызывает

Traceback (most recent call last):
  File "...", line 37, in <module>
    connection.execute(employees_list.insert())
TypeError: insert() takes exactly 2 arguments (0 given)

1 Ответ

0 голосов
/ 13 июня 2018

Ваша текущая проблема заключается в том, что вы используете list.insert метод, который не имеет ничего общего с SQLAlchemy .

Если вам нужно правильно вставить объекты в базу данныхиспользуя SQLAlchemy , вы можете открыть базу данных Session, создать EmployeeData экземпляры, добавить их в сеанс и зафиксировать изменения.

Для этого мы можем определить EmployeeData инициализатор следующим образом

class EmployeeData(Base):
    __tablename__ = 'employee_data'
    id = Column(Integer, primary_key=True)
    name = Column(String(120))
    department = Column(String(120))
    jobTitle = Column(String(120))
    email = Column(String(120))

    def __init__(self, name, department, jobTitle, email):
        self.name = name
        self.department = department
        self.jobTitle = jobTitle
        self.email = email

Открыть Session

from sqlalchemy.orm import Session, sessionmaker
...
session_factory = sessionmaker(engine)
session = session_factory()

Создать EmployeeData экземпляров

employees_list = [EmployeeData(name=item['displayName'],
                               department=item['department'],
                               jobTitle=item['jobTitle'],
                               email=item['workEmail'])
                  for item in employees]

Добавить EmployeeData экземпляров и зафиксировать изменения

session.add_all(employees_list)
session.commit()

Тест

Поскольку у меня нет доступа к услуге Bamboo, я буду имитировать ответ

employees = [{'displayName': 'John Doe',
              'department': 'IT',
              'jobTitle': 'Python Developer',
              'workEmail': 'jdoe@company.com'}]

Следуя приведенным выше шагам, я получил employee_db.db * 1039База данных * SQLite в моем рабочем каталоге.Давайте откроем его, используя SQLite CLI (из SQLite tools )

sqlite> .open employee_db.db
sqlite> select * from employee_data;
1|John Doe|IT|Python Developer|jdoe@company.com

Дополнительные сведения

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