Найти - Пользователи
Полная версия: mysqldb отображение datetime
Начало » Базы данных » mysqldb отображение datetime
1
axe
делаю запрос к БД через mysqldb. в результате запроса присутствуют данные вида:
datetime.datetime(2008, 1, 5, 18, 15, 30)
можно ли указать формат вывода даты, т.е. чтоб на выходе была строка?
pythonwin
покажи запрос
PS в mysql не знаю, но pgsql есть функция to_char, используя которую можно переводить датавремя в строку заданого формата.
select to_char(now(), ‘DD.MM.YYYY HH:MI:SS’)

посмотри в mysql аналог
pythonwin
код в mysql
SELECT CAST( NOW( ) AS CHAR )
axe
    c_query = "select * from `user`"
c_Connect = MySQLdb.connect( host=c_host, db=c_database, user=c_user )
c_Cursor = c_Connect.cursor()
c_Cursor.execute( c_query )
c_Result = c_Cursor.fetchone()
(4L, datetime.datetime(2008, 1, 5, 18, 15, 30), ‘John’, None, 1)
как изменить запрос - не понял.
PooH
А зачем? просто приведите результат к нужной строке уже на клиенте
c_Result[1].strftime("%d.%m.%Y %H:%M")
axe
в моём случае python должен только передавать данные, а не работать с ними.
т.е. обработки данных надо свести к минимуму

тут http://megalib.com/books/129/glava05.htm пишут:
Если Вы имеете установленный пакет mx.DateTime , MySQLdb использует его для связанных с датой объектов. Иначе они будут возвращены как строки. Вы можете также изменять словарь преобразования типов, чтобы возвратить их как другие объектные классы.
похоже, что у меня этот пакет установлен :)

не понятно, что это за словарь преобразования типов, как его менять.
pythonwin
попробуй код в mysql
SELECT cast( DATE_FORMAT( NOW( ) , ‘%d.%m.%Y’ ) AS char ) ;
axe
pythonwin, не понятно.
если выполнить
    c_Cursor.execute( "SELECT cast( DATE_FORMAT( NOW( ) , '%d.%m.%Y' ) AS char )" )
то результатом будет просто сегодняшняя дата. да, она будет возвращена в виде строки, но нужно все даты, которые записаны в таблицах БД возвращать в python в виде строк.

обратил внимание, что вместе с классом connect инициализируются дополнительные функции:
    c_Connect.encoders[datetime.datetime]( datetime.datetime(2008, 1, 5, 18, 15, 30), None )
выдаёт строку ‘2008-01-05 18:15:30’

как указать курсору, что он должен использовать функцию c_Connect.encoders (она же DateTime2literal) ?
PooH
Это вам как пример привели. Поставте вместо NOW() в запросе имя нужного поля. А использование “*” в селектах вообще-то плохой тон ;)
axe
понятно. тем временем нашёл правильное решение.

в MySQLdb.connect.encoders содержится набор правил для преобразования результатов запросов.
правила можно менять, по умолчанию они наследуются из MySQLdb.converters.conversions

т.е. если написать:
conv = MySQLdb.converters.conversions
c_Connect = MySQLdb.connect( host=c_host, db=c_database, user=c_user, conv=conv1 )
то ничего не изменится :)

если написать
c_Connect = MySQLdb.connect( host=c_host, db=c_database, user=c_user, conv={} )
то все правила для преобразования результатов запросов будут отменены!

если захочется, то можно отменить именно преобразование datetime.datetime.
хотя, на самом деле, мне надо было отменить все конвертирования.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB