문제

MySQLDB 모듈을 사용하여 데이터베이스에 정보를 삽입하는 데 어려움을 겪고 있습니다. 테이블에 6 개의 변수를 삽입해야합니다.

cursor.execute ("""
    INSERT INTO Songs (SongName, SongArtist, SongAlbum, SongGenre, SongLength, SongLocation)
    VALUES
        (var1, var2, var3, var4, var5, var6)

""")

누군가가 여기서 구문으로 나를 도울 수 있습니까?

도움이 되었습니까?

해결책

SQL 쿼리에 문자열 보간을 사용하는 것을 조심하십시오. 입력 매개 변수를 올바르게 벗어나지 않고 애플리케이션이 SQL 주입 취약성에 열려두기 때문입니다. 차이는 사소한 것처럼 보일지 모르지만 실제로는 엄청납니다..

잘못된 (보안 문제 포함)

c.execute("SELECT * FROM foo WHERE bar = %s AND baz = %s" % (param1, param2))

수정 (탈출 중)

c.execute("SELECT * FROM foo WHERE bar = %s AND baz = %s", (param1, param2))

SQL 문에서 매개 변수를 바인딩하는 데 사용되는 수정자가 DB API 구현에 따라 다르며 MySQL 클라이언트 라이브러리가 사용한다는 혼란에 추가됩니다. printf 보다 일반적으로 받아 들여지는 '?'대신 스타일 구문 마커 (예 : 사용 python-sqlite).

다른 팁

사용할 수있는 몇 가지 옵션이 있습니다. Python의 String iterpolation에 익숙해지고 싶을 것입니다. 이와 같은 것을 알고 싶을 때 미래에 더 많은 성공을 거두는 용어입니다.

쿼리에 더 좋습니다 :

some_dictionary_with_the_data = {
    'name': 'awesome song',
    'artist': 'some band',
    etc...
}
cursor.execute ("""
            INSERT INTO Songs (SongName, SongArtist, SongAlbum, SongGenre, SongLength, SongLocation)
            VALUES
                (%(name)s, %(artist)s, %(album)s, %(genre)s, %(length)s, %(location)s)

        """, some_dictionary_with_the_data)

객체 나 사전에 모든 데이터를 이미 가지고 있다는 점을 고려하면 두 번째 형식이 더 적합합니다. 또한 1 년 안에 돌아와서이 방법을 업데이트해야 할 때 문자열에 "%s"모양을 계산해야합니다. :)

링크 된 문서는 다음 예를 제시합니다.

   cursor.execute ("""
         UPDATE animal SET name = %s
         WHERE name = %s
       """, ("snake", "turtle"))
   print "Number of rows updated: %d" % cursor.rowcount

따라서 이것을 자신의 코드에 적용하면됩니다 - 예 : 예 :

cursor.execute ("""
            INSERT INTO Songs (SongName, SongArtist, SongAlbum, SongGenre, SongLength, SongLocation)
            VALUES
                (%s, %s, %s, %s, %s, %s)

        """, (var1, var2, var3, var4, var5, var6))

(송이 길이가 숫자 인 경우 %s 대신 %d를 사용해야 할 수도 있습니다).

실제로, 변수 (송 길이)가 숫자 인 경우에도 매개 변수를 올바르게 바인딩하려면 %s로 포맷해야합니다. %d를 사용하려고하면 오류가 발생합니다. 다음은이 링크의 작은 발췌문입니다 http://mysql-python.sourceforge.net/mysqldb.html:

쿼리를 수행하려면 먼저 커서가 필요하고 쿼리를 실행할 수 있습니다.

c=db.cursor()
max_price=5
c.execute("""SELECT spam, eggs, sausage FROM breakfast
          WHERE price < %s""", (max_price,))

이 예에서 Max_Price = 5 왜 문자열에서 %s를 사용하는 이유는 무엇입니까? mysqldb는 그것을 문자열 '5'인 SQL 리터럴 값으로 변환하기 때문입니다. 완료되면 쿼리는 실제로 "... Where Price <5"라고 말합니다.

선택한 답변과 Marcel과 동일한 안전한 의미를 대안으로, 여기에 Python 사전을 사용하여 값을 지정하는 소형 방법이 있습니다. 삽입 할 열을 추가하거나 제거 할 때 쉽게 수정할 수 있다는 이점이 있습니다.

  meta_cols=('SongName','SongArtist','SongAlbum','SongGenre')
  insert='insert into Songs ({0}) values ({1})'.
        .format(','.join(meta_cols), ','.join( ['%s']*len(meta_cols) ))
  args = [ meta[i] for i in meta_cols ]
  cursor=db.cursor()
  cursor.execute(insert,args)
  db.commit()

어디에 메타 삽입 할 값을 보유하는 사전입니다. 업데이트는 같은 방식으로 수행 할 수 있습니다.

  meta_cols=('SongName','SongArtist','SongAlbum','SongGenre')
  update='update Songs set {0} where id=%s'.
        .format(','.join([ '{0}=%s'.format(c) for c in meta_cols ]))
  args = [ meta[i] for i in meta_cols ]
  args.append( songid )
  cursor=db.cursor()
  cursor.execute(update,args)
  db.commit()

여기에 또 다른 방법이 있습니다. MySQL 공식 웹 사이트에 문서화되어 있습니다.https://dev.mysql.com/doc/connector-python/en/connector-python-api-mysqlcursor-execute.html

정신적으로, 그것은 @trey Stout의 대답의 동일한 정비공을 사용하고 있습니다. 그러나 나는 이것이 더 예쁘고 읽기 쉬운 것을 발견했다.

insert_stmt = (
  "INSERT INTO employees (emp_no, first_name, last_name, hire_date) "
  "VALUES (%s, %s, %s, %s)"
)
data = (2, 'Jane', 'Doe', datetime.date(2012, 3, 23))
cursor.execute(insert_stmt, data)

변수의 필요성을 더 잘 설명하기 위해 :

NB : 탈출이 끝나는 것을 주목하십시오.

employee_id = 2
first_name = "Jane"
last_name = "Doe"

insert_stmt = (
  "INSERT INTO employees (emp_no, first_name, last_name, hire_date) "
  "VALUES (%s, %s, %s, %s)"
)
data = (employee_id, conn.escape_string(first_name), conn.escape_string(last_name), datetime.date(2012, 3, 23))
cursor.execute(insert_stmt, data)

첫 번째 솔루션은 잘 작동합니다. 여기에 작은 세부 사항을 추가하고 싶습니다. 교체/업데이트를 시도하는 변수가 유형 STR이어야하는지 확인하십시오. MySQL 유형은 10 진수이지만 쿼리를 실행할 수 있도록 매개 변수 변수를 str로 만들어야했습니다.

temp = "100"
myCursor.execute("UPDATE testDB.UPS SET netAmount = %s WHERE auditSysNum = '42452'",(temp,))
myCursor.execute(var)
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top