MySQL에 Python datetime.datetime 객체 삽입


120

MySQL 테이블에 날짜 열이 있습니다. datetime.datetime()이 열에 개체 를 삽입하고 싶습니다 . execute 문에서 무엇을 사용해야합니까?

나는 시도했다 :

now = datetime.datetime(2009,5,5)

cursor.execute("INSERT INTO table
(name, id, datecolumn) VALUES (%s, %s
, %s)",("name", 4,now))

다음과 같은 오류가 발생합니다. "TypeError: not all arguments converted during string formatting" 대신 무엇을 사용해야 %s합니까?


당신은 주위에 인용을 놓친%s cursor.execute("INSERT INTO table (name, id, datecolumn) VALUES (%s, %s , '%s')",("name", 4,now))
Sheshnath

답변:


198

시간 필드의 경우 다음을 사용하십시오.

import time    
time.strftime('%Y-%m-%d %H:%M:%S')

strftime은 datetime에도 적용된다고 생각합니다.


4
또한 열 이름이 예약어 가 아닌지 확인하세요 . "current_date"라는 이름이 문제를 일으킨다는 사실을 깨닫는 데 30 분이 걸렸습니다.
Pakman

2
time이 예에는 무엇이 있습니까?
James McMahon

1
J McMahon : 시간은 Python 모듈입니다.
dstromberg

누군가가 유일한 년, 월, 일을 가져 오려면 어떻게해야합니까?
Pooja Khatri

42

datecolumn 값 주위에 따옴표가 필요하기 때문에 TypeError가 발생할 가능성이 높습니다.

시험:

now = datetime.datetime(2009, 5, 5)

cursor.execute("INSERT INTO table (name, id, datecolumn) VALUES (%s, %s, '%s')",
               ("name", 4, now))

형식과 관련하여 위의 명령 (밀리 초 포함)과 다음을 사용하여 성공했습니다.

now.strftime('%Y-%m-%d %H:%M:%S')

도움이 되었기를 바랍니다.


8
당신은 따옴표가 없을 수 있습니다 %s에서 pymsql.
Martin Thoma 2015

1
세 번째 % s 주위의 따옴표로 인해 오류가 발생합니다.
realjin

13

대신 객체 now.date()를 얻기 위해 사용하십시오 Date.DateTime .

작동하지 않으면 문자열로 변환하면 작동합니다.

now = datetime.datetime(2009,5,5)
str_now = now.date().isoformat()
cursor.execute('INSERT INTO table (name, id, datecolumn) VALUES (%s,%s,%s)', ('name',4,str_now))

문자열 매개 변수를 따옴표로 묶을 필요가 없습니다. 예 : "... VALUES ( '% s', '% s', '% s')"
Gareth Simpson

5

Python 메서드를 사용 datetime.strftime(format)합니다 '%Y-%m-%d %H:%M:%S'. 여기서 format = .

import datetime

now = datetime.datetime.utcnow()

cursor.execute("INSERT INTO table (name, id, datecolumn) VALUES (%s, %s, %s)",
               ("name", 4, now.strftime('%Y-%m-%d %H:%M:%S')))

시간대

시간대가 문제가되는 경우 MySQL 시간대는 다음과 같이 UTC로 설정할 수 있습니다.

cursor.execute("SET time_zone = '+00:00'")

시간대는 Python으로 설정할 수 있습니다.

now = datetime.datetime.utcnow().replace(tzinfo=datetime.timezone.utc)

MySQL 문서

MySQL은 다음 형식의 DATETIME 및 TIMESTAMP 값을 인식합니다.

'YYYY-MM-DD HH : MM : SS' 또는 'YY-MM-DD HH : MM : SS' 형식 의 문자열 입니다. 여기에서도 "완전한"구문이 허용됩니다. 날짜 부분 또는 시간 부분 사이의 구분 기호로 모든 구두점 문자를 사용할 수 있습니다. 예 : '2012-12-31 11:30:45', '2012 ^ 12 ^ 31 11 + 30 + 45', '2012/12/31 11 * 30 * 45'및 '2012 @ 12 @ 31 11 ^ 30 ^ 45 '는 동일합니다.

날짜 및 시간 부분과 소수 초 부분 사이에서 인식되는 유일한 구분 기호는 소수점입니다.

날짜 및 시간 부분은 공백이 아닌 T로 구분할 수 있습니다. 예를 들어 '2012-12-31 11:30:45' '2012-12-31T11 : 30 : 45'는 동일합니다.

'YYYYMMDDHHMMSS'또는 'YYMMDDHHMMSS'형식의 구분 기호가없는 문자열 (문자열이 날짜로 이해되는 경우) 예를 들어 '20070523091528'및 '070523091528'은 '2007-05-23 09:15:28'로 해석되지만 '071122129015'는 불법이며 (무의미한 분 부분이 있음) '0000-00-00 00 : 00:00 '.

YYYYMMDDHHMMSS 또는 YYMMDDHHMMSS 형식의 숫자 (날짜로 의미가있는 경우) 예를 들어, 19830905132800 및 830905132800은 '1983-09-05 13:28:00'로 해석됩니다.


3

어떤 데이터베이스에 연결하고 있습니까? Oracle은 날짜 형식에 대해 까다로울 수 있으며 ISO 8601 형식을 좋아 합니다.

** 참고 : 죄송합니다. MySQL을 사용 중이라고 읽었습니다. 날짜 형식을 지정하고 테스트를위한 별도의 직접 SQL 호출로 시도하십시오.

Python에서는 다음과 같은 ISO 날짜를 얻을 수 있습니다.

now.isoformat()

예를 들어 오라클은 다음과 같은 날짜를 좋아합니다.

insert into x values(99, '31-may-09');

데이터베이스에 따라 Oracle 인 경우 TO_DATE해야 할 수 있습니다.

insert into x
values(99, to_date('2009/05/31:12:00:00AM', 'yyyy/mm/dd:hh:mi:ssam'));

TO_DATE의 일반적인 사용법은 다음과 같습니다.

TO_DATE(<string>, '<format>')

다른 데이터베이스를 사용하는 경우 (커서를보고 Oracle이라고 생각했습니다. 틀릴 수 있음) 날짜 형식 도구를 확인하십시오. MySQL의 경우 DATE_FORMAT ()이고 SQL Server는 CONVERT입니다.

또한 SQLAlchemy 와 같은 도구를 사용하면 이와 같은 차이점이 제거되고 생활이 쉬워집니다.


시간대 인식 객체를 사용하면 생성 된 문자열에 시간대 데이터가 포함되고 더 이상 필요한 mysql 형식과 일치하지 않기 때문에 datetime.isoformat () 사용을 권장하지 않습니다.
frankster

0

파이썬 datetime.date (전체 datetime.datetime이 아님)를 사용하는 경우 날짜를 문자열로 캐스팅하십시오. 이것은 매우 간단하며 저에게 적합합니다 (mysql, python 2.7, Ubuntu). 열 published_date은 MySQL 날짜 필드이고 python 변수 publish_datedatetime.date.

# make the record for the passed link info
sql_stmt = "INSERT INTO snippet_links (" + \
    "link_headline, link_url, published_date, author, source, coco_id, link_id)" + \
    "VALUES(%s, %s, %s, %s, %s, %s, %s) ;"

sql_data = ( title, link, str(publish_date), \
             author, posted_by, \
             str(coco_id), str(link_id) )

try:
    dbc.execute(sql_stmt, sql_data )
except Exception, e:
    ...

0

t-sql로 iserting 할 때

이것은 실패합니다 :

select CONVERT(datetime,'2019-09-13 09:04:35.823312',21)

이것은 작동합니다 :

select CONVERT(datetime,'2019-09-13 09:04:35.823',21)

쉬운 방법:

regexp = re.compile(r'\.(\d{6})')
def to_splunk_iso(dt):
    """Converts the datetime object to Splunk isoformat string."""
    # 6-digits string.
    microseconds = regexp.search(dt).group(1)
    return regexp.sub('.%d' % round(float(microseconds) / 1000), dt)
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.