Python с PyQuery: не работают поля таблицы с форматированием строк - PullRequest
0 голосов
/ 25 октября 2019

Я построил функцию, которая легко вставляет мои данные в мою таблицу:

class.py
...
def execute( self, query, *args ):
  try:
    self.cur.execute( query, args )
    self.con.commit()
    return self.cur.fetchall()
  except Exception as e:
    self.l.err( msg="Exception while running following query:\n\t%s\n\nwith following *args:\n\t%s" % ( str( query ), str( args ) ), fatal=True )
...
def insert( self, table, data ):
""" data[field] = value -> Has to be validated already:

    Ex.: data['content'] = json.dumps( content )
"""


  # insert post
  try:

    # query vars
    ins_query = 'INSERT INTO %s' % table

    ins_query_fields = ' ('
    ins_query_values = ' VALUES('

    ins_data_fields = []
    ins_data_values = []

    isFirstLoop = True
    for field, value in data.items():

      # prepare queries
      if isFirstLoop:
        ins_query_fields += '%s'
        ins_query_values += '%s'
        isFirstLoop = False
      else:
        ins_query_fields += ',%s'
        ins_query_values += ',%s'

      # add field data
      ins_data_fields.append( field )

      # add value data
      ins_data_values.append( value )

    # end queries
    ins_query_fields += ')'
    ins_query_values += ')'
    ins_query += ins_query_fields + ins_query_values 

    self.execute( ins_query, *tuple( ins_data_fields + ins_data_values ) ) # modern tuple takes no comma at the end
    self.l.log( 'Post saved to DB/Table: %s' % table )

  except Exception as e:
    self.l.err( msg='Error saving post to DB/Table: %s', % table fatal=True  )

    for field, value in data.items():
      self.l.err( msg='\t%s: %s' % ( field, value ) )

В test.py я вызываю эту функцию примерно так:

data = {}
data['field1'] = 123456789
data['field2' ] = 'TestValue'
class.insert( 'example_table', data )

Кстати: класс. py - это не настоящее имя модуля или пакета. Когда я запускаю код, я получаю следующее исключение:

pymysql.err.ProgrammingError: (1064, "You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''field1','field2','field3','field4','field5' at line 1")

Совершенно очевидно: PyQuery вставляет указанные строки в виде строк, а числа в виде чисел. Пожалуйста, имейте в виду, что каждый pyQuery должен быть форматирован с использованием %s в качестве подготовленного оператора. Мои поля - начиная с data['field'] - являются строками. Грязным решением было бы сначала сделать строковый формат, а затем добавить данные в виде кортежа:

ins_query_fields = '( %s, %s, %s )' % ( field1, field2, field3 )

Но нужно никогда вставлять любые данные непосредственно в строку из-за SqlInjection.

Вопрос: Как настроить функцию таким образом, чтобы PyQuery вставлял поля таблицы без кавычек и выполнял подготовленный оператор с действительными значениями.

С уважением, заранее спасибо

...