MariaDB重复插入

时间:2017-09-26 06:43:42

标签: python mariadb

我有以下Python代码来检查MariaDB记录是否已存在,然后插入。但是,我正在插入重复项。代码有问题,或者有更好的方法吗?我是使用Python-MariaDB的新手。

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

以下是该表的代码。

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

2 个答案:

答案 0 :(得分:1)

为tweet_has字段添加唯一常量。

alter table tweets  modify tweet_hash varchar(255) UNIQUE ;

答案 1 :(得分:1)

每个表都应该有一个PRIMARY KEYid应该是那个吗? (CREATE TABLE并非如此。)根据定义,PK是UNIQUE,因此在插入副本时会出错。

同时

  • 为什么要tweet_hash?只需索引tweet
  • 如果特定限制小于此值,请不要说255
  • user_iduser_name应位于另一个“查找”表中,而不是在此表中。
  • user_verified是否属于user?或者每条推文?
  • 如果您期待数百万条推文,则需要缩小此表并编制索引 - 否则您将遇到性能问题。