Создание уникального идентификатора MySQL при вставке элементов списка в БД

#mysql #sql #rss

#mysql #sql #RSS-канал

Вопрос:

На самом деле я загружаю каналы с домашней страницы и пытаюсь записать их в базу данных MySQL. Каналы публикуются в формате RSS. Все работает нормально без создания уникального идентификатора. Таким образом, команда Insert должна быть неправильной!

Вот мой код:

 import feedparser
import urllib2
import cookielib
import MySQLdb
import time
import datetime
from cookielib import CookieJar
from urllib2 import urlopen

db = MySQLdb.connect(host="localhost", # your host, usually localhost
                 user="root", # your username - SELECT * FROM mysql.user
                 passwd="****", # your password
                 db="sentiment_analysis") # name of the data base

cur = db.cursor()
cur.execute("DROP TABLE IF EXISTS feeddata_lse")

sql = """CREATE TABLE feeddata_lse (LSE_ID INT NOT NULL AUTO_INCREMENT,PRIMARY KEY(LSE_ID),Unix_Timesstamp integer, III_Timestamp varchar(255), Source varchar(255), Title varchar(255), Text TEXT,  Link varchar(255), Epic varchar(255), CommentNr integer, Author varchar(255))"""
cur.execute(sql)

opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(CookieJar()))
opener.addheaders = [{'User-agent','Mozilla/5.0'}]

def feed_load(feed):
return [(time.time(),
         entry.published,
         'lse',
         entry.title,
         entry.summary,
         entry.link,
         (entry.link.split('?ShareTicker=')[1]).split('amp;post=')[0],
         entry.link.split('amp;post=')[1],
         entry.author)
        for entry
        in feedparser.parse(feed).entries]

def main():
FEED_URL = "http://www.lse.co.uk/chat/recent/"
feed = feed_load(FEED_URL)

print feed[1][1]

for item in feed:
    cur.execute("""INSERT INTO feeddata_lse VALUES (%s,%s,%s,%s,%s,%s,%s,%s,%s)""",item)
db.commit()
  

Если я удалю LSE_ID INT NOT NULL AUTO_INCREMENT, PRIMARY KEY(LSE_ID) инструкцию out to Insert, все будет работать нормально. Моя основная проблема с изменением части вставки заключается в том, что RSS-канал содержит список каналов, и каждый канал представляет собой другой список.

Спасибо, что помогли мне. Пожалуйста, объясните свои аргументы примерами кода, потому что я очень неопытен. Если у вас есть какие-либо вопросы, не стесняйтесь задавать!

Вот отчет об ошибке:

 Traceback (most recent call last):
File "C:/Python27/MySQL_finalversion/rss_db_connection_mysql_v1.py", line 54, in <module>
main()
File "C:/Python27/MySQL_finalversion/rss_db_connection_mysql_v1.py", line 48, in main
cur.execute("""INSERT INTO feeddata_lse VALUES (%s,%s,%s,%s,%s,%s,%s,%s,%s)""",item)
File "C:Python27libsite-packagesMySQLdbcursors.py", line 205, in execute
self.errorhandler(self, exc, value)
File "C:Python27libsite-packagesMySQLdbconnections.py", line 36, in defaulterrorhandler
raise errorclass, errorvalue
OperationalError: (1136, "Column count doesn't match value count at row 1")
  

Ответ №1:

LSE_ID INT NOT NULL AUTO_INCREMENT, PRIMARY KEY(LSE_ID) Строка встречается в инструкции создания таблицы, а не в инструкции insert. Если вы удалите столбец из инструкции создания таблицы, но оставите свою инструкцию ВСТАВКИ без изменений, вы действительно получите ошибку «Количество столбцов не соответствует значению», потому что вы пытаетесь вставить на один столбец больше, чем определено в вашей таблице.

Я думаю, вы обнаружите, что на самом деле хотите сохранить этот первичный ключ. Вместо того, чтобы удалять LSE_ID INT NOT NULL AUTO_INCREMENT, PRIMARY KEY(LSE_ID) из вашего оператора создания таблицы, может быть, попробуйте явно назвать столбцы в вашем операторе INSERT следующим образом?

INSERT INTO feeddata_lse(Unix_Timesstamp, III_Timestamp, Source, Title, Text, Link, Epic, CommentNr, Author) VALUES (%s,%s,