2016-12-27 1 views
0
나는 SQL 테이블에 날짜 형식을 변환 할

작동하지 않습니다와 나는이 작동하지 않는 이유 단서가 없다 :mysql.connector 커밋()

import mysql.connector 
from mysql.connector import errorcode 
from dateutil.parser import parse 

appname = "dropbox" 

# connect to the database 
# Add your DB connection information 

try: 

    database = mysql.connector.connect(user='root', password='root', 

           host='localhost', 

           database='google_play') 

except mysql.connector.Error as err: 

    if err.errno == errorcode.ER_ACCESS_DENIED_ERROR: 
     print("Something is wrong with your user name or password") 

    elif err.errno == errorcode.ER_BAD_DB_ERROR: 
     print("Database does not exist") 

    else: 
     print(err) 

DBcursor = database.cursor(buffered=True) 
DBcursor2 = database.cursor(buffered=True) 

# DB connection established. Now get the table: 

query = ("SELECT * FROM googleplay_%s_test" % appname) 

DBcursor.execute(query) 

# Execute the date conversion: 

for (id, user_name, date, url, rating, title, text, reply_date, reply_text) in DBcursor: 

    date_string = parse(date) 
    date_string.strftime("%Y-%m-%d") 

    conversion = ("UPDATE googleplay_%s_test SET date='date_string' WHERE id='id'" % appname) 

    DBcursor2.execute(conversion) 

    database.commit() 

    print("Convertet to: ", date_string) 

# close the database connection 

DBcursor.close() 
DBcursor2.close() 
database.close() 

변환이 작동하는 것 같다합니다. 출력 :

Convertet to: 2016-12-02 00:00:00 
Convertet to: 2016-11-25 00:00:00 
Convertet to: 2016-11-16 00:00:00 
Convertet to: 2016-12-04 00:00:00 

괜찮습니다. 그러나 테이블에 새 값을 쓰지는 않습니다. 먼저 commit() 명령이 누락되었다고 생각했지만 거기에 있습니다.

+0

테이블을 결정하는 매개 변수를 사용해야하는 경우 기본 테이블 디자인에 큰 문제가 있음을 의미합니다. – e4c5

답변

0

이 :

conversion = ("UPDATE googleplay_%s_test SET date='date_string' WHERE id='id'" % appname) 
DBcursor2.execute(conversion) 

입니다 분명하지 date_string 변수의 값으로 googleplay_<whatever>_test을 설정하는 것 - 그것은 litteral 'date_string' 문자열로 설정하려고합니다. MySQL은 단지 자동으로 작업을 건너 뜁니다 (아마도 최고로 경고를 발행 할 것입니다). 그리고 대부분의 경우 기본 MySQL 설정으로 모든 것을 위장한 것입니다.

편집 : 같은이 where 절에 적용 :

WHERE id='id' 

만하는 ID 레코드를 업데이트하려고합니다은 litteral 문자열 'id'입니다.

당신이 원하는 :

query = "SELECT id, date FROM googleplay_%s_test" % appname 
DBcursor.execute(query) 

for id, date in DBcursor: 
    # code here 

우리가 그것을하는 동안 :

만이 개 필드를해야하는 경우

conversion = "UPDATE googleplay_%s_test SET date=%%s WHERE id=%%s" % appname 
DBcursor2.execute(conversion, [date_string, id]) 

FWIW, 당신은 더 나은 만이 개 필드를 검색 할 것

  1. cursor.execute()은 쿼리에 의해 영향을받은 행 수 (선택, 업데이트 됨, 삭제됨 등)를 반환합니다.
  2. database.commit()을 루프 밖으로 넣을 수 있습니다. 단일 커밋이 더 빠르며 모든 변경 사항이 적용되었는지 또는 전혀 변경되지 않았는지 확인하여 데이터베이스를 반 백업 상태로 유지하지 않도록합니다.

또한 date_string로 전달하는 당신이 date_string.strftime()에 대한 호출의 결과를 폐기하기 때문에 여기에, 실제로 문자열하지만 datetime.datetime 대상이 아닌 있습니다. 하지만 그게 괜찮을 dbapi 커넥터 db와 파이썬 유형 사이의 변환하는 방법을 알고 있어야합니다.

마지막으로 적절한 데이터베이스 스키마에는 googleplay_test 테이블이 있고 appname 필드가 있습니다.

+0

도움 주셔서 감사합니다. 불행히도, 그것은 많이 변하지 않았습니다. 여전히 테이블에 새 값을 쓰지는 않습니다. –

+0

where 절에서 같은 문제가 발생합니다 (cf my edit). 당신은 내 대답 FWIW에서 그것을 발견했을 수 ... –

+0

완벽! 이제 효과가 있습니다. 도와 주셔서 감사합니다. –

관련 문제