2017-09-26 6 views
0

Ich habe den folgenden Python-Code zu überprüfen, ob ein MariaDB-Datensatz bereits vorhanden ist, und dann einfügen. Ich habe jedoch Duplikate eingefügt. Stimmt etwas nicht mit dem Code oder gibt es einen besseren Weg? Ich bin neu in Python-MariaDB.MariaDB Duplikate eingefügt werden

import mysql.connector as mariadb 
from hashlib import sha1 

mariadb_connection = mariadb.connect(user='root', password='', database='tweets_db') 

# The values below are retrieved from Twitter API using Tweepy 
# For simplicity, I've provided some sample values 
id = '1a23bas' 
tweet = 'Clear skies' 
longitude = -84.361549 
latitude = 34.022003 
created_at = '2017-09-27' 
collected_at = '2017-09-27' 
collection_type = 'stream' 
lang = 'us-en' 
place_name = 'Roswell' 
country_code = 'USA' 
cronjob_tag = 'None' 
user_id = '23abask' 
user_name = 'tsoukalos' 
user_geoenabled = 0 
user_lang = 'us-en' 
user_location = 'Roswell' 
user_timezone = 'American/Eastern' 
user_verified = 1 
tweet_hash = sha1(tweet).hexdigest() 

cursor = mariadb_connection.cursor(buffered=True) 
cursor.execute("SELECT Count(id) FROM tweets WHERE tweet_hash = %s", (tweet_hash,)) 
if cursor.fetchone()[0] == 0: 
    cursor.execute("INSERT INTO tweets(id,tweet,tweet_hash,longitude,latitude,created_at,collected_at,collection_type,lang,place_name,country_code,cronjob_tag,user_id,user_name,user_geoenabled,user_lang,user_location,user_timezone,user_verified) VALUES(%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s)", (id,tweet,tweet_hash,longitude,latitude,created_at,collected_at,collection_type,lang,place_name,country_code,cronjob_tag,user_id,user_name,user_geoenabled,user_lang,user_location,user_timezone,user_verified)) 
    mariadb_connection.commit() 
    cursor.close() 
else: 
    cursor.close() 
    return 

Unten ist der Code für die Tabelle.

CREATE TABLE tweets (
    id VARCHAR(255) NOT NULL, 
    tweet VARCHAR(255) NOT NULL, 
    tweet_hash VARCHAR(255) DEFAULT NULL, 
    longitude FLOAT DEFAULT NULL, 
    latitude FLOAT DEFAULT NULL, 
    created_at DATETIME DEFAULT NULL, 
    collected_at DATETIME DEFAULT NULL, 
    collection_type enum('stream','search') DEFAULT NULL, 
    lang VARCHAR(10) DEFAULT NULL, 
    place_name VARCHAR(255) DEFAULT NULL, 
    country_code VARCHAR(5) DEFAULT NULL, 
    cronjob_tag VARCHAR(255) DEFAULT NULL, 
    user_id VARCHAR(255) DEFAULT NULL, 
    user_name VARCHAR(20) DEFAULT NULL, 
    user_geoenabled TINYINT(1) DEFAULT NULL, 
    user_lang VARCHAR(10) DEFAULT NULL, 
    user_location VARCHAR(255) DEFAULT NULL, 
    user_timezone VARCHAR(100) DEFAULT NULL, 
    user_verified TINYINT(1) DEFAULT NULL 
); 
+0

Können wir 'SHOW CREATE TABLE mytable' und das tatsächliche SQL generiert sehen. –

+0

Sicher habe ich die Frage mit dem eigentlichen Code-Schnipsel und der CREATE TABLE-Syntax aktualisiert, danke –

+1

Wenn Sie nach einzigartigen Tweets suchen, machen Sie 'tweet'' UNIQUE' oder mindestens 'INDEXed'. Der "Hash" fügt nur Komplexität hinzu. –

Antwort

1

Eine eindeutige Konstante zu tweet_has filed hinzufügen.

alter table tweets modify tweet_hash varchar(255) UNIQUE ; 
+0

Ich musste auch eine Ausnahme im Python-Code hinzufügen, um doppelte Einfügungsfehler zu ignorieren: 'except mariadb.IntegrityError' –

1

Jede Tabelle sollte eine PRIMARY KEY haben. Soll das id sein? (Die CREATE TABLE sagt dies nicht.) Ein PK ist per Definition UNIQUE, so dass beim Einfügen eines Duplikats ein Fehler auftreten würde.

Zwischenzeit:

  • Warum haben eine tweet_hash? Einfach indexieren tweet.
  • Sagen Sie nicht 255, wenn bestimmte Grenzen kleiner sind.
  • user_id und user_name sollte in einer anderen "Lookup" -Tabelle sein, nicht beide in dieser Tabelle.
  • Gehört user_verified zu der user? Oder mit jedem Tweet?
  • Wenn Sie Millionen von Tweets erwarten, muss diese Tabelle verkleinert und indexiert werden - sonst treten Leistungsprobleme auf.
+0

Danke für die guten Punkte, hier sind einige meiner Überlegungen und Modifikationen basierend auf Ihren Vorschlägen. 1) 'tweet_hash' ermöglicht ein schnelleres Nachschlagen als das Suchen nach einer vollständigen Textzeichenfolge mit mehreren Wörtern. 2) Ich habe die 'tweet_hash'-Größe auf 50 reduziert, Sie haben zu Recht darauf hingewiesen, dass die Größe der Spalten nicht optimiert ist. 3) Du hast Recht, ich sollte das neu strukturieren, um 2 Tabellen zu haben. 4) Ich habe Indizes, aber ja, es muss kleiner werden –

+0

Die Zufälligkeit eines "Hash" macht es nicht schneller. Der Overhead einer unnötigen Spalte und eines Index wirkt mehr als einem Vorteil entgegen. –

Verwandte Themen