SqlAlchemy mysql миллисекунда или микросекундная точность

Я отваживался на одиссею, пытаясь получить дробное временное разрешение, работающее должным образом в моей базе данных. Я использую метод python datetime.now() для создания объектов даты. Затем я сохраняю эти объекты в поле, которое отображается в COLUMN(DATETIME(9)) который из библиотеки SqlAlchemy. Первоначально я получал сообщение об усечении моих данных. Это связано с тем, что я использовал mysql 5.5. С тех пор я обновлен до 5.6.19 и больше не получаю усеченную информацию.

Тем не менее, база данных по-прежнему фактически не содержит дробных записей времени. Например, вот значение, с которого создается объект datetime.now ():

 2015-04-17 16:31:12.804444 

Выше было то, чего я ожидал бы. Объект в памяти имеет разрешение в микросекундах. Теперь, после сохранения этого в базе данных mysql, я вижу следующее значение, если я открою клиент командной строки mysql и верну строку с помощью оператора select:

 2015-04-17 16:31:13 

Очевидно, что значение округляется до ближайшей секунды. Это плохо, и я понятия не имею, что вызывает это!

В случае, если это имеет значение, я использую mysql-connector-python == 2.0.3

UPDATE: Я также попытался использовать COLUMN(DATETIME(6)) , но получил то же поведение.

Я ниже, включая модель, в случае, если информация имеет значение:

 class User(Base): __tablename__ = 'Users' uid = Column(INT, primary_key=True, autoincrement=True) dateCreated = Column(DATETIME(6)) def __init__(self, *args, **kwargs): super(user, self).__init__(*args, **kwargs) self.dateCreated = datetime.now() 

ОБНОВЛЕНИЕ: предложение Педро не было проблемой, хотя это определенно помогло мне добиться прогресса, поэтому большое спасибо. Я пробовал переходить через код в sql-коннекторе, пока не добрался до инструкции вставки mysql. В заявлении действительно содержится дробное значение времени. Однако при выполнении значение округляется. Когда я сделал описание на столе, я заметил, что тип datetime – это только то, что datetime когда это действительно должно быть datetime(6) .

Я сам создаю базу данных, используя модель SA, которая явно объявляет Column(DATETIME(6)) и Base.metadata.create_all(self.db, checkfirst=True) , поэтому я не понимаю, почему (6) не заканчивается в фактической структуре таблицы. Думаю, я скоро это выясню, и когда я это сделаю, я опубликую обновление.

UPDATE: конструктор DATETIME не принимает спецификацию длины поля. Он принимает только аргумент для часовых поясов. Мне не ясно, как указать длину поля datetime, так как для таких типов, как varchar, вы просто передадите его конструктору. Погружение продолжается.

3 Solutions collect form web for “SqlAlchemy mysql миллисекунда или микросекундная точность”

Проблема, с которой я столкнулась, заключается в том, что класс SqlAlchemy DATETIME не работает с требованием mysql о передаче значения (6) в конструктор для представления дробных значений времени. Вместо этого нужно использовать класс sqlalchemy.dialects.mysql.DATETIME . Этот класс позволяет использовать параметр fsp (параметр дробных секунд). Таким образом, объявление столбца должно выглядеть так:

 dateCreated = Column(DATETIME(fsp=6)) 

Спасибо тем, кто ответил. Это помогло моему исследованию в конечном итоге споткнуться об этом эзотерическом и очень запутанном различии.

Кажется, это открытая проблема с MySQLdb, а не MySQL или SQLAlchemy.

http://sourceforge.net/p/mysql-python/feature-requests/24/

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

Согласно документации MySQL , она поддерживает только до 6 мест (микросекунд):

«MySQL 5.6.4 и up расширяет дробную секундную поддержку значений TIME, DATETIME и TIMESTAMP с точностью до микросекунд (6 цифр)

Я не знаю точно, но указание 9 цифр может вернуть колонну меньшей точности по умолчанию.

  • Несколько доменов и поддоменов в одном экземпляре Pyramid
  • Как запросить для всех групп типа 'foo', которые содержат user_x? (таблица «многие-ко-многим»)
  • Создание экземпляра класса из словаря?
  • Как проверить, существует ли схема PostgreSQL с помощью SQLAlchemy?
  • тестовая колба sql alchemy
  • SQLAlchemy: распечатать фактический запрос
  • Запрос гибридного свойства в SQLAlchemy
  • Родительский экземпляр не связан с сеансом; ленивая загрузка атрибута «account» не может продолжаться
  • Python - лучший язык программирования в мире.