У меня есть такая ситуация, когда я создал метод, который будет вставлять строки в базу данных. Я предоставляю этому методу столбцы, значения и имя таблицы.
СТОЛБЦЫ = [['ИМЯ','ФАМИЛИЯ','ВОЗРАСТ'],['ФАМИЛИЯ','ИМЯ','ВОЗРАСТ']]
ЗНАЧЕНИЯ = [['Джон','Доу',56],[ 'Доу','Джон',56]]
TABLE = 'люди'
Вот как я хотел бы пройти, но это не работает:
db = DB_CONN.MSSQL() #method for connecting to MS SQL or ORACLE etc.
cursor = db.cursor()
sql = "insert into %s (?) VALUES(?)" % TABLE
cursor.executemany([sql,[COLUMNS[0],VALUES[0]],[COLUMNS[1],VALUES[1]]])
db.commit()
Вот как он будет передавать запрос, но проблема в том, что у меня должны быть предопределенные имена столбцов, а это нехорошо, потому что что, если другой список имеет другую сортировку столбцов? Тогда имя будет в фамилии и фамилия в имени.
db = DB_CONN.MSSQL() #method for connecting to MS SQL or ORACLE etc.
cursor = db.cursor()
sql = 'insert into %s (NAME,SURNAME,AGE) VALUES (?,?,?)'
cursor.executemany(sql,[['John','Doe',56],['Doe','John',56]])
db.commit()
Надеюсь, я объяснил это достаточно ясно. Пс. СТОЛБЦЫ и ЗНАЧЕНИЯ извлекаются из словаря json
[{'ИМЯ':'Джон','ФАМИЛИЯ':'Доу','ВОЗРАСТ':56...},{'ФАМИЛИЯ':'Доу','ИМЯ':'Джон','ВОЗРАСТ':77 ...}]
если это поможет.
РЕШЕНИЕ:
class INSERT(object):
def __init__(self):
self.BASE_COL = ''
def call(self):
GATHER_DATA = [{'NAME':'John','SURNAME':'Doe','AGE':56},{'SURNAME':'Doe','NAME':'John','AGE':77}]
self.BASE_COL = ''
TABLE = 'person'
#check dictionary keys
for DATA_EVAL in GATHER_DATA:
if self.BASE_COL == '': self.BASE_COL = DATA_EVAL.keys()
else:
if self.BASE_COL != DATA_EVAL.keys():
print ("columns in DATA_EVAL.keys() have different columns")
#send mail or insert to log or remove dict from list
exit(403)
#if everything goes well make an insert
columns = ','.join(self.BASE_COL)
sql = 'insert into %s (%s) VALUES (?,?,?)' % (TABLE, columns)
db = DB_CONN.MSSQL()
cursor = db.cursor()
cursor.executemany(sql, [DATA_EVAL.values() for DATA_EVAL in GATHER_DATA])
db.commit()
if __name__ == "__main__":
ins = INSERT()
ins.call()