2014-12-18 5 views
0

저는 Python에서 새로운 Wordpress 사용자를 추가하려고합니다. 이 함수를 만들었습니다 :Python과 MySQLdb를 사용하여 Wordpress에 새 사용자 추가

def adduser(domain_ip,username,password): 
    db = MySQLdb.connect(host=domain_ip, user=username, passwd=password) 
    cur = db.cursor() 
    cur.execute("USE %s;" % "yogatrai") 
    cmd1 = """INSERT INTO `wp_users` (`ID`, `user_login`, `user_pass`, `user_nicename`, `user_email`, `user_status`) VALUES ('5', 'demo1', MD5('demo1demo'), 'firstname lastname', '[email protected]', '0');""" 
    cur.execute(cmd1) 

동일한 sql 명령이 Navicat에서 작동합니다. 파이썬에서는 ok를 반환하지만 새로운 사용자는 데이터베이스에 존재하지 않습니다. 내 오류는 어디에 있습니까?

답변

0

삽입 작업 후에 db 연결을 커밋하고 닫아야합니다. sql이 당신의 쿼리 문자열이라고 가정 는 수행

try: 
    # Execute the SQL command 
    cursor.execute(sql) 
    # Commit your changes in the  database 
    db.commit() 
except: 
    # Rollback in case there is any error 
    db.rollback() 

# disconnect from server 
db.close() 

체크 아웃이 예제를 여기에 : 당신이 거래를 범하지 않은 것처럼 http://www.tutorialspoint.com/python/python_database_access.htm

0

것 같습니다.

with connection as cursor: 
    cursor.execute(query, parameters) 

connection가 열려있는 데이터베이스 연결 개체입니다, query이 매개 변수가있는 SQL 문이며, parameters는 사용자가 제공 한 값은 다음과 같습니다 MySQLdb는 다음과 같이, with를 통해 트랜잭션 컨텍스트를 관리 할 수있는 편리한 방법을 제공합니다. SQL 문을 매개 변수화하는 것은 구문 오류를 방지하고 악의적 인 SQL 주입으로부터 사용자를 보호하는 데 도움이되므로 매우 중요합니다. 매개 변수화의 또 다른 이점은 매개 변수화 된 SQL을 함수 외부에 정의하여 함수 자체를 훨씬 쉽게 읽을 수 있다는 것입니다.

adduser 함수에서이 방법을 구현하는 방법은 다음과 같습니다. 첫째, 매개 변수화 된 쿼리로 SQL 문을 다시 작성 :

cmd1 = """ 
INSERT INTO `wp_users` 
    (`ID`, `user_login`, `user_pass`, `user_nicename`, `user_email`, `user_status`) 
VALUES 
    (%s, %s, MD5(%s), %s, %s, %s); 
""" 

나는 내가 매우 빠르게 복사 파이썬 소스 코드와 MySQL 워크 벤치 또는 명령 행 사이에 내 SQL을 붙여 넣을 수 있습니다 자신의 라인에 문을 넣어. 좋아하는 스타일을 사용할 수 있습니다. 주의해야 할 중요한 점은 각 사용자 입력 값에 대해 %s 자리 표시자가 있다는 것입니다. execute 함수는 이스케이프 특수 문자, 문자열 따옴표 등을 처리하므로 처리 할 필요가 없습니다.

이제, 기능은 훨씬 더 간단 할 수있다 :

def adduser(domain_ip, username, password): 
    db = MySQLdb.connect(host=domain_ip, user=username, passwd=password, db="yogatrai") 
    args = (5, 'demo1', 'demo1demo', 'firstname lastname', '[email protected]', 0) 
    with db as cur: 
     cur.execute(cmd1, args) 

MySQLdb.connectdb 매개 변수는 USE 문을 대체하고 with 컨텍스트 매니저는 트랜잭션을 처리한다. with 블록 내에 예외가 발생하면 트랜잭션이 롤백됩니다. 그렇지 않은 경우 with 블록이 종료되면 커밋됩니다. MySQLdb와의 트랜잭션 관리에 대한이 접근법에 대해 더 자세히 말하면 in another answer입니다.

최종 코드는 다르게 보일 것입니다. 그러나 테스트 목적으로는 위의 코드가 잘 작동합니다. 내 유일한 다른 조언은 cmd1보다 의미있는 이름을 사용하십시오. 내 SQL 문을 상수로 취급하고 싶습니다. 따라서이 이름을 INSERT_USER과 같이 지정하십시오. 중요한 것은 명확하고 일관성있는 것입니다.

관련 문제