Как вставить или обновить в SQL с помощью Python - PullRequest
0 голосов
/ 07 января 2019

У меня есть список в Python, который я сейчас вставляю в таблицу SQL с именем SocketTest. В основном я храню журналы подключений. Я хочу просто сохранить последнюю точку доступа (точку доступа), к которой кто-то подключен, вместо списка их, как я делаю сейчас. Они читают и проходят через сокет в хронологическом порядке, поэтому самый новый список, который я получаю в своей функции, всегда является самым актуальным для этого пользователя. По сути, моя программа читает из сокета и составляет список с информацией, разделенной запятыми, затем я вставляю ее в свою таблицу, и, хотя у меня все еще есть информация в сокете, она продолжает повторяться. Мой список по имени я. Я пытался понять это сам, но я не опытный. Я хотел бы посмотреть на PK, который является идентификатором, и вставить строку, если идентификатор еще не сохранен, и заменить или обновить сохраненную строку, если идентификатор уже существует. Я искал замену и вставил дубликат ключа, но не смог заставить его работать. Любая помощь приветствуется, код ниже.

SocketTest - это таблица: ПК это идентификатор: Pringle - пример строки:

РЕДАКТИРОВАТЬ: я импортирую MYSQLDB как mdb

def ParseArray(l): #parses line in socke
i.append(l.split()[+0] + '')  # Gets Day
i.append(l.split()[+1] + '')  # Gets Month
i.append(l.split()[+3] + '')  # Gets Year
i.append(l.split()[+2] + '')  # Gets Time
i.append(l.split()[-2] + '')  # Gets Device
i.append(l.split()[+9] + '')  # Gets  ID
i.append(l.split()[+18] + '')  # Gets AP
i.append(l.split()[+19] + '')  # Gets AP Group
i.append(l.split()[+16] + '/n')  # Gets MAC
#insert line into db else by primary key (ID)
#update line to db if ID doesn't exist
#pringle = ['Dec', '11', '2018', '15:10:51', 'iPhone', '[jeref2]', 
#    'home', 'hm1', '45.88.34.58)\n']


sql = "INSERT INTO SocketTest (month, day, year, time, device, Id, ap, 
    ApGroup, MacAdd) VALUES ('%s');" % "', '".join(i)
cur.execute(sql)
con.commit()

Редактировать: Остальной код

#!/bin/python

import socket
import os, os.path
import MySQLdb as mdb
con = mdb.connect('x', 'x', 'x', 'x');
cur = con.cursor()



#pringle=['Dec', '11', '2018', '15:10:51', 'iPhone', '[josheer]', 'FRD', 'BHJ', '45.33.88.34)\n']














def ParseArray(l): #parses line in socke
i.append(l.split()[+0] + '')  # Gets Day
i.append(l.split()[+1] + '')  # Gets Month
i.append(l.split()[+3] + '')  # Gets Year
i.append(l.split()[+2] + '')  # Gets Time
i.append(l.split()[-2] + '')  # Gets Device
i.append(l.split()[+9] + '')  # Gets  ID
i.append(l.split()[+18] + '')  # Gets AP
i.append(l.split()[+19] + '')  # Gets AP Group
i.append(l.split()[+16] + '/n')  # Gets MAC

try:
    row_to_insert = [val1, val2, val3]
    cur.execute("INSERT INTO SocketTest (month, day, year, time, device,Id, ap, ApGroup, MacAdd) VALUES(%s, %s, %s)",
                   (i)

except: pymysql.IntegrityError:
    cur.execute("""UPDATE SocketTest
    SET column2 = {1}, column3 = {2}
    WHERE column1 = {0}
    """.format(val1, val2, val3)







#sql = "REPLACE INTO SocketTest (month, day, year, time, device,Id, ap, ApGroup, MacAdd) VALUES ('%s');" % "', '".join(
    #i)
#cur.execute(sql)
#con.commit()





con.commit()








print(i)

del i[:]



i = []

if os.path.exists("/home/log/x"):
os.remove("/home/log/x")

sock = socket.socket(x, sx)
sock.bind("/home/log/xt")
infile = sock.makefile('r')




while True:
    l = sock.recv(4096).decode()
    ParseArray(l)

Ответы [ 2 ]

0 голосов
/ 07 января 2019

Я бы переписал вашу функцию как:

def ParseArray(l): #parses line in socke
  day = (l.split()[+0] + '')  # Gets Day
  month = (l.split()[+1] + '')  # Gets Month
  year = (l.split()[+3] + '')  # Gets Year
  time = (l.split()[+2] + '')  # Gets Time
  device = (l.split()[-2] + '')  # Gets Device
  Id = (l.split()[+9] + '')  # Gets  ID
  ap = (l.split()[+18] + '')  # Gets AP
  ApGroup = (l.split()[+19] + '')  # Gets AP Group
  MacAdd = (l.split()[+16] + '')  # Gets MAC
  #print (day, month, year, time, device, Id, ap, ApGroup, MacAdd)
  #insert line into db else by primary key (ID)
  #update line to db if ID doesn't exist
  #pringle = ['Dec', '11', '2018', '15:10:51', 'iPhone', '[jeref2]',
  #    'home', 'hm1', '45.88.34.58)\n']

  sql = "INSERT INTO SocketTest (month, day, year, time, device, Id, ap, ApGroup, MacAdd) VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s);"
  cur.execute(sql, (day, month, year, time, device, Id, ap, ApGroup, MacAdd))
  con.commit()
0 голосов
/ 07 января 2019

В случае, если вы используете библиотеку pymysql, что-то вроде этого сделает работу:

row_to_insert = [val1, val2, val3]

cursor.execute("INSERT INTO my_table_name (column1, column2, column3) VALUES(%s, %s, %s)", 
    row_to_insert)

дополнительную информацию можно найти здесь: Как использовать переменные в выражении SQL в Python?

РЕДАКТИРОВАТЬ после комментария автора:

try:
    row_to_insert = [val1, val2, val3]
    cursor.execute("INSERT INTO my_table_name (column1, column2, column3) VALUES(%s, %s, %s)",
                   row_to_insert)

except pymysql.IntegrityError:
    cursor.execute("""UPDATE my_table_name 
    SET column2 = {1}, column3 = {2}
    WHERE column1 = {0}
    """.format(val1, val2, val3)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...