Pergunta

Eu estou tendo um momento difícil usando o módulo MySQLdb para inserir informações no meu banco de dados. Eu preciso inserir 6 variáveis ??na tabela.

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

""")

Alguém pode me ajudar com a sintaxe aqui?

Foi útil?

Solução

Cuidado ao usar interpolação de string para consultas SQL, uma vez que não vai escapar os parâmetros de entrada corretamente e vai deixar o seu aberta aplicação de vulnerabilidades de injeção SQL. A diferença pode parecer trivial, mas na realidade é enorme .

incorreto (com questões de segurança)

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

correta (com fuga)

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

Ele acrescenta que a confusão que os modificadores utilizados para parâmetros de vinculação em uma instrução SQL varia entre diferentes implementações DB API e que a sintaxe cliente mysql utiliza a biblioteca de estilo printf em vez do mais comumente aceita '?' marcador (usada por exemplo. python-sqlite).

Outras dicas

Você tem algumas opções disponíveis. Você vai querer se sentir confortável com iterpolation seqüência de python. Que é um termo que você pode ter uma pesquisa mais sucesso no futuro, quando você quer saber coisas como esta.

Melhor para consultas:

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)

Considerando que você provavelmente tem todos os seus dados em um objeto ou dicionário já, o segundo formato vai servi-lo melhor. Também é chato ter que contar "% s" aparências em uma corda quando você tem que voltar e atualizar este método em um ano:)

Os documentos vinculados dar o exemplo a seguir:

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

Então você só precisa de se adaptar isso para o seu próprio código - exemplo:

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

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

(Se SongLength é numérico, você pode precisar usar% d em vez de% s).

Na verdade, mesmo se sua variável (SongLength) é numérico, você ainda vai ter que formatá-lo com% s, a fim de vincular o parâmetro corretamente. Se você tentar usar% d, você receberá um erro. Aqui está um pequeno trecho a partir deste link http://mysql-python.sourceforge.net/MySQLdb.html :

Para executar uma consulta, você primeiro precisa de um cursor, e então você pode executar consultas sobre ele:

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

Neste exemplo, MAX_PRICE = 5 Por que, então, o uso% s na cadeia? Porque MySQLdb irá convertê-lo para um valor literal SQL, que é a string '5'. Quando terminar, a consulta vai realmente dizer:" ... ONDE preço <5" .

Como uma alternativa para a resposta escolhida, e com a mesma semântica seguros de Marcel, aqui é uma forma compacta de usar um dicionário Python para especificar os valores. Tem a vantagem de ser fácil de modificar como você adicionar ou remover colunas para inserir:

  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()

Onde meta é o dicionário segurando os valores para inserir. Atualização pode ser feito da mesma maneira:

  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()

Aqui está uma outra maneira de fazê-lo. Ele está documentado no site oficial do MySQL. https: //dev.mysql. com / doc / connector-python / en / connector-python-api-mysqlcursor-execute.html

No espírito, ele está usando o mesmo mecânico da resposta de @Trey Stout. No entanto, eu encontrar um presente mais bonito e mais legível.

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)

E para melhor ilustrar a necessidade de variáveis:

NB:. Nota a fuga sendo feito

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)

A primeira solução funciona bem. Eu quero adicionar um pequeno detalhe aqui. Verifique se a variável que você está tentando substituir atualização / ele vai tem que ser um tipo str. Meu tipo mysql é decimal, mas eu tive que fazer a variável parâmetro como str para ser capaz de executar a consulta.

temp = "100"
myCursor.execute("UPDATE testDB.UPS SET netAmount = %s WHERE auditSysNum = '42452'",(temp,))
myCursor.execute(var)
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top