문제

Python을 배우고 있으며 첫 번째 프로젝트로 Twitter RSS 피드를 가져 와서 데이터를 구문 분석하고 데이터를 SQLITE 데이터베이스에 삽입합니다. 나는 각 피드 항목을 콘텐츠 변수 (예 : "낮은 구매 ..."), URL 변수 (예 : u 'http://bit.ly/hbfwl'), a 해시 태그 목록 (예 : #Stocks ', u'#stockmarket ', u'#un finance ', u'#money ', u'#mkt ']). 또한이 세 가지 정보를 SQLITE "RSSENTRIES"테이블의 3 개의 개별 열에 삽입하는 데 성공했습니다. 각 행은 다른 RSS 항목/트윗입니다.

그러나 개별 RSS 피드 항목 (즉, 개별 트윗)과 각 항목과 관련된 해시 태그 사이에 다량의 관계가있는 데이터베이스를 설정하고 싶습니다. 따라서 SQLALCHEMY를 사용하여 다음 테이블을 설정했습니다 (첫 번째 테이블에는 다운로드 및 구문 분석하려는 Twitterers의 RSS 피드 URL이 포함됩니다).

RSSFeeds = schema.Table('feeds', metadata,
    schema.Column('id', types.Integer, 
        schema.Sequence('feeds_seq_id', optional=True), primary_key=True),
    schema.Column('url', types.VARCHAR(1000), default=u''),
)

RSSEntries = schema.Table('entries', metadata,
    schema.Column('id', types.Integer, 
        schema.Sequence('entries_seq_id', optional=True), primary_key=True),
    schema.Column('feed_id', types.Integer, schema.ForeignKey('feeds.id')),
    schema.Column('short_url', types.VARCHAR(1000), default=u''),
    schema.Column('content', types.Text(), nullable=False),
    schema.Column('hashtags', types.Unicode(255)),
)

tag_table = schema.Table('tag', metadata,
    schema.Column('id', types.Integer,
       schema.Sequence('tag_seq_id', optional=True), primary_key=True),
    schema.Column('tagname', types.Unicode(20), nullable=False, unique=True)
)

entrytag_table = schema.Table('entrytag', metadata,
    schema.Column('id', types.Integer,
        schema.Sequence('entrytag_seq_id', optional=True), primary_key=True),
    schema.Column('entryid', types.Integer, schema.ForeignKey('entries.id')),
    schema.Column('tagid', types.Integer, schema.ForeignKey('tag.id')),
)

지금까지 나는 다음 코드를 사용하여 세 가지 주요 정보 만 rssentries 테이블에 성공적으로 입력 할 수있었습니다 (약어 어디에 ...)

engine = create_engine('sqlite:///test.sqlite', echo=True)
conn = engine.connect()
.........
conn.execute('INSERT INTO entries (feed_id, short_url, content, hashtags) VALUES 
    (?,?,?,?)', (id, tinyurl, content, hashtags))

자, 여기에 큰 질문이 있습니다. 데이터를 어떻게 삽입합니까? 피드 태그 그리고 태그 이름 테이블? 이것은 시작하기 때문에 나에게 진짜 고집 지점입니다. Hasthag 변수는 현재 목록이며 각 피드 항목은 0과 6 개의 해시 태그 사이의 어느 곳에서나 포함 할 수 있습니다. 전체 목록을 단일 열에 삽입하는 방법을 알고 있지만 목록의 요소 만 별도의 열 (또는이 예에서 행)에 삽입하는 방법은 없습니다. 더 큰 고집 지점은 개별 해시 태그를 태그 이름 태그 이름이 다양한 피드 항목에서 사용될 수있는 경우 테이블과 "연관"을 제대로 표시하는 방법 피드 태그 테이블.

간단히 말해서, 각 테이블이 모두 완료되었을 때 어떻게보아야하는지 정확히 알고 있지만, 데이터를 태그 이름 그리고 피드 태그 테이블. 전체 "Many-Many"설정은 나에게 새로운 것입니다.

나는 이것에 대한 당신의 도움을 정말로 사용할 수 있습니다. 제안해 주셔서 감사합니다.

-greg

추신 - 편집하다 - 개미 Aasma의 훌륭한 제안 덕분에 나는 거의 일을 할 모든 것을 얻으십시오. 구체적으로, 첫 번째와 2 차 코드 블록은 이제 잘 작동하지만 3 차 코드 블록을 구현하는 데 문제가 있습니다. 다음 오류가 발생합니다.

Traceback (most recent call last):
  File "RSS_sqlalchemy.py", line 242, in <module>
    store_feed_items(id, entries)
  File "RSS_sqlalchemy.py", line 196, in store_feed_items
    [{'feedid': entry_id, 'tagid': tag_ids[tag]} for tag in hashtags2])
NameError: global name 'entry_id' is not defined

그런 다음 개미 Aasma가 "Entry_id"부분을 어디에서 얻었는지 알 수 없었기 때문에 "Entries.id"로 교체하려고 시도하여 "entries"테이블에서 "ID"를 삽입 할 수 있다고 생각했습니다. 그러나이 경우이 오류가 발생합니다.

Traceback (most recent call last):
  File "RSS_sqlalchemy.py", line 242, in <module>
    store_feed_items(id, entries)
  File "RSS_sqlalchemy.py", line 196, in store_feed_items
    [{'feedid': entries.id, 'tagid': tag_ids[tag]} for tag in hashtags2])
AttributeError: 'list' object has no attribute 'id'

문제가 어디에 있는지 잘 모르겠습니다. "Entry_id"부분이 어디에 있는지 이해하지 못하므로 모든 관련 "삽입"코드 아래에 붙여 넣었습니다. 누군가 내가 무엇이 잘못되었는지 볼 수 있도록 도와 줄 수 있습니까? 또한 "EntryTag_table"대신 마지막 테이블 "FeedTag_table"을 잘못 호출하고 있음을 알았습니다. 항목 해시 태그에 대한 피드보다는 해시 태그에. 이후 위의 코드를 수정했습니다.

feeds = conn.execute('SELECT id, url FROM feeds').fetchall()

def store_feed_items(id, items):
    """ Takes a feed_id and a list of items and stored them in the DB """
    for entry in items:
        conn.execute('SELECT id from entries WHERE short_url=?', (entry.link,))
        s = unicode(entry.summary) 
        test = s.split()
        tinyurl2 = [i for i in test if i.startswith('http://')]
        hashtags2 = [i for i in s.split() if i.startswith('#')]
        content2 = ' '.join(i for i in s.split() if i not in tinyurl2+hashtags2)
        content = unicode(content2)
        tinyurl = unicode(tinyurl2)
        hashtags = unicode (hashtags2)
        date = strftime("%Y-%m-%d %H:%M:%S",entry.updated_parsed)

        conn.execute(RSSEntries.insert(), {'feed_id': id, 'short_url': tinyurl,
            'content': content, 'hashtags': hashtags, 'date': date})    

        tags = tag_table
        tag_id_query = select([tags.c.tagname, tags.c.id], tags.c.tagname.in_(hashtags))
        tag_ids = dict(conn.execute(tag_id_query).fetchall())
        for tag in hashtags:
            if tag not in tag_ids:
                result = conn.execute(tags.insert(), {'tagname': tag})
                tag_ids[tag] = result.last_inserted_ids()[0]

        conn.execute(entrytag_table.insert(),
            [{'feedid': id, 'tagid': tag_ids[tag]} for tag in hashtags2])
도움이 되었습니까?

해결책

먼저, sqlalchemy sql builder를 사용하여 삽입물을 사용하여 SQLALCEHEMY에게 당신이하고있는 일에 대한 더 많은 통찰력을 제공해야합니다.

 result = conn.execute(RSSEntries.insert(), {'feed_id': id, 'short_url': tinyurl,
        'content': content, 'hashtags': hashtags, 'date': date})
 entry_id = result.last_insert_ids()[0]

스키마에 태그 연결을 삽입하려면 주먹을 주거나 태그 식별자를 찾아 존재하지 않는 것을 만들어야합니다.

tags = tag_table
tag_id_query = select([tags.c.tagname, tags.c.id], tags.c.tagname.in_(hashtags))
tag_ids = dict(conn.execute(tag_id_query).fetchall())
for tag in hashtags:
    if tag not in tag_ids:
        result = conn.execute(tags.insert(), {'tagname': tag})
        tag_ids[tag] = result.last_inserted_ids()[0]

그런 다음 관련 ID를 feedtag_table. 실행 메소드에 DICTS 목록을 전달하여 ExecuteMany 지원을 사용할 수 있습니다.

conn.execute(feedtag_table.insert(),
    [{'feedid': entry_id, 'tagid': tag_ids[tag]} for tag in hashtags])
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top