pymysql и sqlalchemy: AttributeError: у объекта 'DateTime' нет атрибута 'translate' - PullRequest
0 голосов
/ 28 апреля 2018

При попытке сохранить новую запись в БД я получаю вышеуказанную ошибку, связанную с имеющимся у меня атрибутом DateTime (engagementDate).

Тип значения, которое я передаю sqlalchemy, выглядит нормально:

<wx.DateTime: "Sat Apr 28 00:00:00 2018">

В MySql моя схема имеет следующие настройки:

Сортировка по умолчанию: utf8_general_ci

Набор символов по умолчанию: utf8

Значение даты взято из wx.adv.DatePickerCtrl в wx.Dialog (форма), правильно представлено и проверено в моем локальном utf8.

Моя строка подключения к MySQL имеет локальное определение: utf8mb4.

Таблица создана с этой моделью:

class Contractors(DeclarativeBase):
    __tablename__ = "contractors"

    id = Column(Integer, primary_key=True)
    company_name = Column("company_name", Unicode(80))
    company_address = Column("company_address", String(250))
    ...
    is_training_provider = Column("is_training_provider", Boolean())
    engagement_date = Column("engagement_date", DateTime)
    comments = Column("comments", Text())

Моя модель olv:

class OlvContractors(object):

    def __init__(self, id, company_name, company_address, company_city, company_zip, company_country, company_phone1,
                 company_phone2, company_description, contact_person, cp_email, cp_phone1, cp_phone2,
                 is_training_provider, engagement_date, comments):
        self.id = id  # unique row id from database
        self.company_name = company_name
        self.company_address = company_address
        ...
        self.is_training_provider = is_training_provider
        self.engagement_date = engagement_date
        self.comments = comments

Оператор SQL, сгенерированный sqlalchemy:

INSERT
INTO
contractors(company_name, company_address, company_city, company_zip, company_country, company_phone1, company_phone2,
            company_description, contact_person, cp_email, cp_phone1, cp_phone2, is_training_provider, engagement_date,
            comments)
VALUES( % (company_name)
s, % (company_address)
s, % (company_city)
s, % (company_zip)
s, % (company_country)
s, % (company_phone1)
s, % (company_phone2)
s, % (company_description)
s, % (contact_person)
s, % (cp_email)
s, % (cp_phone1)
s, % (cp_phone2)
s, % (is_training_provider)
s, % (engagement_date)
s, % (comments)
s)
{'company_name': '', 'company_address': '', 'company_city': '', 'company_zip': '', 'company_country': '',
 'company_phone1': '', 'company_phone2': '', 'company_description': '', 'contact_person': '', 'cp_email': '',
 'cp_phone1': '', 'cp_phone2': '', 'is_training_provider': 0, 'engagement_date'
 : < wx.DateTime: "Sat Apr 28 00:00:00 2018" >, 'comments': ''}

Вы можете видеть, что дата помолвки показывает ТИП, а не значение. Нужно ли явно конвертировать это? Как?

Я передаю значения для вставки в БД в виде словаря:

{'company_name': '', 'company_address': '', 'company_city': '', 'company_zip': '', 'company_country': '', 'company_phone1': '', 'company_phone2': '', 'company_description': '', 'contact_person': '', 'cp_email': '', 'cp_phone1': '', 'cp_phone2': '', 'is_training_provider': False, 'engagement_date': <wx.DateTime: "Sat Apr 28 00:00:00 2018">, 'comments': ''}

... используя эту функцию:

def insertRecord(targetObject, dict_values):
    print("dict values received {}".format(dict_values))
    session = connectToDatabase()
    session.execute(targetObject.__table__.insert(), dict_values)
    session.commit()
    session.close()

Спасибо за любые советы!

1 Ответ

0 голосов
/ 29 апреля 2018

Размещение здесь моего решения, для чьей-либо выгоды:

Похоже, не было конвертации из wx.DateTime в Python datetime.

Я использовал функции Майка , предоставленные здесь для преобразования перед отправкой словаря данных в БД следующим образом:

    if isinstance(ctrlValue, wx.DateTime):
        ctrlValue = forms_controller.wxdate2pydate(ctrlValue)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...