Как поместить весь элемент из словаря в базу данных - PullRequest
0 голосов
/ 23 марта 2020

Я покажу вам свою проблему:

Для начала у меня есть список слов в python, например:

"links": [{"url": "http://catherineingram.com/biography.html", "type": {"key": "/type/link"}, "title": "Biography"}, {"url": "http://www.youtube.com/watch?v=4lJK9cfXP3c", "type": {"key": "/type/link"}, "title": "Interview on Consciousness TV"}, {"url": "http://www.huffingtonpost.com/catherine-ingram/", "type": {"key": "/type/link"}, "title": "Blog on Huffington Post"}]

Моя цель - получить только URL и заголовок ссылку и положить их в базу данных. На данный момент я работал только с URL, и я сделал это:

for record in csv.DictReader(open(INPUT_FILE, 'r'), fieldnames=COLUMNS, delimiter='\t'):
    j = json.loads(record['json'])
 result=[]

    if 'links' in j:
        for link in j['links']:
            result.append({'url': link['url']})
            a=(link['url'])

            print(a)
            links=a


    else:
         links = ''

Результат:

http://catherineingram.com/biography.html
http://www.youtube.com/watch?v=4lJK9cfXP3c
http://www.huffingtonpost.com/catherine-ingram/

Так что это прекрасно, я получил именно то, что хотел, но проблема сейчас в том, когда я помещаю ссылки в свою базу данных с помощью:

links=a

, я получаю только последний элемент url в своей базе данных, а не 3 url, поэтому я пытаюсь иметь 3 url в своей базе данных, но я получил только последний.
Я надеюсь, что вы можете помочь мне в моей проблеме

Спасибо, выслушайте меня !!!!

ps:

Если вы хотите получить более подробную информацию о коде, он здесь:

for record in csv.DictReader(open(INPUT_FILE, 'r'), fieldnames=COLUMNS, delimiter='\t'):
    j = json.loads(record['json'])
result=[]

    if 'links' in j:
        for link in j['links']:
            result.append({'url': link['url']})
            a=(link['url'])

            print(a)
            links=a


    else:
         links = ''

         #   print(n)
            #links_url.append(n['url'])
            #links_title.append(n['title'])
            # links_url.append(n['url'])
            # links_title.append(n['title'])



    c.execute('INSERT INTO AUTHORS VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)',
          [record['key'],
           j.get('name'),
           j.get('eastern_order'),
           j.get('personal_name'),
           j.get('enumeration'),
           j.get('title'),
           bio,
           alternate_names,
           uris,
           j.get('location'),
           j.get('birth_date'),
           j.get('death_date'),
           j.get('date'),
           j.get('wikipedia'),
           links
          ])
db.commit()

Ответы [ 2 ]

1 голос
/ 23 марта 2020

Спасибо, ответь мне!

Моя цель - поместить все мои URL в мою базу данных

Итак, я сделал это:

for record in csv.DictReader(open(INPUT_FILE, 'r'), fieldnames=COLUMNS, delimiter='\t'):
    j = json.loads(record['json'])
    if 'bio' in j and 'value' in j['bio']:
        bio = j['bio']['value']
    else:
        bio = None
    if 'alternate_names' in j:
        for n in j['alternate_names']:
            alternate_names = n
    else:
        alternate_names = None
    if 'uris' in j:
        for n in j['uris']:
            uris = n
    else:
        uris = None




    if 'links' in j:
        for link in j['links']:
            dico=({'url': link['url']})
            print(dico['url'])
            links=dico['url']




    else:
         links = ''

         #   print(n)
            #links_url.append(n['url'])
            #links_title.append(n['title'])
            # links_url.append(n['url'])
            # links_title.append(n['title'])



    c.execute('INSERT INTO AUTHORS VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)',
          [record['key'],
           j.get('name'),
           j.get('eastern_order'),
           j.get('personal_name'),
           j.get('enumeration'),
           j.get('title'),
           bio,
           alternate_names,
           uris,
           j.get('location'),
           j.get('birth_date'),
           j.get('death_date'),
           j.get('date'),
           j.get('wikipedia'),
           links
          ])
db.commit()

Но когда я сделал это, все остальные элементы (био, альтернативные имена ...) работают, но не ссылки, потому что мне нужно сделать другой метод, потому что это список словаря, как это:

"links": [{"url": "http://catherineingram.com/biography.html", "type": {"key": "/type/link"}, "title": "Biography"}, {"url": "http://www.youtube.com/watch?v=4lJK9cfXP3c", "type": {"key": "/type/link"}, "title": "Interview on Consciousness TV"}, {"url": "http://www.huffingtonpost.com/catherine-ingram/"

На данный момент я беру только URL-адрес элемента в словаре, и я пытаюсь поставить В моей базе данных все URL ссылки. Это работает идеально, когда у меня есть только 1 URL, но иногда у меня есть 2 или 3 URL, и когда это происходит, только последний URL находится в моей базе данных, а не другие. Это моя проблема

Спасибо!

0 голосов
/ 23 марта 2020

Как я уже упоминал в своем комментарии к вашему вопросу, у вас есть некоторые проблемы с отступами. Я только догадываюсь о том, чего вы пытаетесь достичь. У вас также есть присваивание переменным, на которые затем никогда не ссылаются в показанном коде, поэтому вполне может быть, что они не были объявлены на нужном уровне.

for record in csv.DictReader(open(INPUT_FILE, 'r'), fieldnames=COLUMNS, delimiter='\t'):
    j = json.loads(record['json'])
    result=[] # what do you do with variable result? Shiuld this be delclared before the 'for record' statment?
    if 'links' in j:
        for link in j['links']:
            result.append({'url': link['url']})
            a=link['url'] # what do you do with variable a?
            print(a)
            links=a # do you need both variables a and links?
            c.execute('INSERT INTO AUTHORS VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)',
                [record['key'],
                 j.get('name'),
                 j.get('eastern_order'),
                 j.get('personal_name'),
                 j.get('enumeration'),
                 j.get('title'),
                 bio,
                 alternate_names,
                 uris,
                 j.get('location'),
                 j.get('birth_date'),
                 j.get('death_date'),
                 j.get('date'),
                 j.get('wikipedia'),
                 links
                ])
    else:
         links = ''
         #   print(n)
            #links_url.append(n['url'])
            #links_title.append(n['title'])
            # links_url.append(n['url'])
            # links_title.append(n['title'])

db.commit() # should this be moved to following the c.execute statement rather than doing one commit for all the inserts?

Выше теперь пишется несколько строк с идентичный бит данных с разными ссылками. Это приводит к ненормализованной базе данных. Не могли бы вы вместо этого написать одну строку, в которой столбец содержал 3 ссылки? Это тоже будет случай ненормализованной базы данных. Опять же, я просто догадываюсь о том, что вы имели в виду под «Я пытаюсь иметь 3 URL в моей базе данных, но я получил только последний».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...