Как импортировать большой файл JSON в MYSQL [дубликат]

Чтобы ваш код работал, вам нужно

legend(x=min(df$Year), y=max(df$N), legend=c('a'), pch=1, lty=1)

x=1 находится вне диапазона вашей оси x. Но, конечно, вы не должны размещать свою легенду в верхнем левом углу в этом случае:

62
задан joshperry 15 April 2016 в 20:32
поделиться

7 ответов

Остерегайтесь использования строковой интерполяции для 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, различаются между различными реализациями API БД и что клиентская библиотека mysql использует синтаксис стиля printf вместо более общепринятого '?' (используется, например, python-sqlite).

210
ответ дан Roman Podlinov 18 August 2018 в 17:01
поделиться
  • 1
    Правильный пример также будет выполняться быстрее во многих случаях – Rick Copeland 22 April 2009 в 02:53
  • 2
    @Specto IMO имеет смысл всегда оставаться с правильными и безопасными способами реализации. Это создает правильные привычки и хорошую культуру программирования. Также никто не знает, как вы будете использовать код в будущем; кто-то может использовать его позже для другой системы или веб-сайта. – Roman Podlinov 21 May 2013 в 16:40
  • 3
    Исходя из php / pdo, я был очень смущен, если маркер printf style %s, и я был в ужасе от того, что я писал уязвимые запросы. Спасибо, что освободились от беспокойства! :) – Darragh Enright 28 June 2015 в 01:43
  • 4
    Когда это единственный параметр, помните, чтобы сохранить запятую: c.execute("SELECT * FROM foo WHERE bar = %s", (param1,)) – Marius Lian 27 July 2016 в 20:31
  • 5
    Для контекста на параметрах в курсоре execute (и почему% s по-прежнему необходимо) ссылка api для курсора MySQLdb находится в mysql-python.sourceforge.net/MySQLdb-1.2.2/public/… – RedBarron 16 March 2017 в 17:51

Фактически, даже если ваша переменная (SongLength) является числовой, вам все равно придется отформатировать ее с помощью% 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 преобразует его в значение литерала SQL, которое представляет собой строку «5». Когда это будет закончено, запрос действительно скажет: «... WHERE price & lt; 5».

5
ответ дан daSong 18 August 2018 в 17:01
поделиться
  • 1
    Да, это странно ... вы думаете, что & quot; printf & quot; формат будет означать ... фактически формат printf, а не только использование% s во всем мире. – fthinker 10 October 2013 в 19:38

Вот еще один способ сделать это. Он задокументирован на официальном сайте 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)

И чтобы лучше проиллюстрировать любую потребность в переменных:

Примечание: обратите внимание на выполненное выполнение.

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)
0
ответ дан Djidiouf 18 August 2018 в 17:01
поделиться

В качестве альтернативы выбранному ответу и с той же безопасной семантикой Marcel's, вот компактный способ использования словаря 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()
5
ответ дан FDS 18 August 2018 в 17:01
поделиться

Связанные документы дают следующий пример:

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

(Если SongLength является числовой , вам может потребоваться использовать% d вместо% s).

12
ответ дан Marcel Guzman 18 August 2018 в 17:01
поделиться
  • 1
    будет ли это работать, когда var1 и var2 имеют charecters like & quot; или ' . – sheki 24 October 2011 в 12:53
  • 2
    AFAIK вы должны использовать %s там независимо от того, какой тип. @sheki: Да – ThiefMaster♦ 27 May 2016 в 11:03

У вас есть несколько доступных вариантов. Вы захотите получить удовольствие от iterpolation строки python.

Лучше для запросов:

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)

Учитывая, что вы, вероятно, имеете все ваши данные в объекте или словаре уже, второй формат подойдет вам лучше. Кроме того, это отстой, чтобы засчитывать появление «% s» в строке, когда вам нужно вернуться и обновить этот метод за год:)

32
ответ дан Trey Stout 18 August 2018 в 17:01
поделиться
0
ответ дан Parth Shah 30 October 2018 в 06:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: