2009-09-10 16 views
7

मैं पायथन सीख रहा हूँ के साथ कई-से-कई डाटाबेस में सम्मिलित करना, और एक पहली परियोजना के रूप में ले रहा हूँ ट्विटर RSS फ़ीड डेटा पार्स करने, और एक SQLite डेटाबेस में डेटा डालने। मैं (जैसे, यू 'http://bit.ly/HbFwL'), और एक हैशटैग सूची सफलतापूर्वक प्रत्येक फ़ीड प्रविष्टि एक सामग्री चर में है (जैसे, "आप कम खरीदना चाहिए ..."), एक यूआरएल चर पार्स करने के लिए सक्षम किया गया है (उदाहरण के लिए, # स्टॉक्स ', यू' # स्टॉकमार्केट ', यू' # फाइनेंस ', यू' # पैसा ', यू' # एमकेटी '])। मैं इन तीन टुकड़ों की जानकारी को एक स्क्लाइट "आरएसईसीएनटीई" तालिका में तीन अलग-अलग स्तंभों में डालने में भी सफल रहा हूं, जहां प्रत्येक पंक्ति एक अलग आरएसएस प्रविष्टि/ट्वीट है।की स्थापना/अजगर, SQLAlchemy, SQLite

हालांकि, मैं एक डेटाबेस स्थापित करना चाहता हूं जहां व्यक्तिगत आरएसएस फ़ीड प्रविष्टियों (यानी व्यक्तिगत ट्वीट्स) और प्रत्येक प्रविष्टि से जुड़े हैंशटैग के बीच कई से अधिक संबंध हैं। तो, मैं SQLAlchemy का उपयोग कर (पहली तालिका सिर्फ Twitterers 'आरएसएस फ़ीड यूआरएल कि मैं डाउनलोड करने और पार्स करने के लिए चाहता हूँ भी शामिल है) निम्न तालिकाओं की स्थापना:

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

अब, यहाँ विशाल सवाल है। मैं feedtag और टैगनाम तालिकाओं में डेटा को कैसे डालूँ? के बाद से शुरू करने के लिए hasthag चर वर्तमान में एक सूची है, और प्रत्येक फ़ीड प्रविष्टि कहीं भी 0 के बीच और, कहते हैं, 6 हैशटैग हो सकता है यह मेरे लिए एक असली चिपका बिंदु है। मुझे पता है कि पूरी सूची को एक कॉलम में कैसे सम्मिलित किया जाए, लेकिन अलग-अलग कॉलम में सूची के तत्वों को कैसे सम्मिलित नहीं किया जाए (या, इस उदाहरण में, पंक्तियां)। टैगनाम तालिका में अलग-अलग हैशटैग को कैसे सम्मिलित किया जा सकता है, इसके बारे में सामान्य सवाल यह है कि कई अलग-अलग फ़ीड प्रविष्टियों में टैगनाम का उपयोग किया जा सकता है, और फिर फीडटाग तालिका में "एसोसिएशन" ठीक से कैसे दिखें ।

संक्षेप में, मैं ठीक-ठीक पता तालिकाओं में से प्रत्येक के लिए जब वे सब काम हो गया कैसी दिखनी चाहिए, लेकिन मैं कैसे टैगनाम और feedtag तालिकाओं में डेटा प्राप्त करने के लिए कोड लिखने के लिए पता नहीं है। पूरे "कई से कई" सेट-अप मेरे लिए नया है।

मैं वास्तव में इस पर आपकी मदद इस्तेमाल कर सकते हैं। किसी सुझाव के लिए अग्रिम धन्यवाद।

-Greg

पी.एस. - संपादित - आसमा उत्तम सुझाव चींटियों के लिए धन्यवाद, मैं लगभग कर लिया है पूरी बात काम करने के लिए मिलता है। विशेष रूप से, कोड के पहले और 2 सुझाए गए ब्लॉक अब ठीक काम करते हैं, लेकिन मुझे कोड के तीसरे ब्लॉक को लागू करने में समस्या आ रही है। मैं निम्नलिखित त्रुटि हो रही है:

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 

फिर, क्योंकि मैं नहीं बता सकता, जहां चींटियों आसमा से, मैं "entries.id" इसकी जगह की कोशिश की, यह सोच कर इस सम्मिलित हो सकता है "entry_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]) 

उत्तर

4

सबसे पहले, आप आवेषण के लिए SQLAlchemy एसक्यूएल निर्माता का उपयोग आप क्या कर रहे में 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] 

तो बस feedtag_table में संबद्ध आईडी के सम्मिलित करें। आप execute विधि में dicts की एक सूची पास करके निष्पादन समर्थन का उपयोग कर सकते हैं।

conn.execute(feedtag_table.insert(), 
    [{'feedid': entry_id, 'tagid': tag_ids[tag]} for tag in hashtags]) 
+0

धन्यवाद - यह बढ़िया है! मैंने पहले बिट में सफलतापूर्वक जोड़ा है, लेकिन जब मैं दूसरी बिट में जोड़ता हूं तो "वैश्विक नाम" चयन 'परिभाषित नहीं किया गया है "त्रुटि है। मैं अनुमान लगा रहा हूं कि मैं कोड में कहां डाल रहा हूं। मैं आपको यह दिखाने के लिए ऊपर दिए गए प्रश्न को संपादित करने की कोशिश करूंगा कि मैंने अब तक क्या किया है, तो शायद आप मेरी गलती को देख सकें? –

+0

ठीक है, मैंने कोड के दूसरे ब्लॉक के साथ समस्या का पता लगाया - मैंने sqlalchemy से "चयन" आयात नहीं किया था! अब, यह बहुत अच्छा काम करता है। मैं बस कोड के तीसरे ब्लॉक को ट्विक करने पर काम कर रहा हूं - कुछ ठीक काम कर रहा है। –

+0

पुन: अंतिम टिप्पणी। मेरा कहना था कि कुछ ठीक काम नहीं कर रहा है। :) मैं 'टैगिड' भाग को समझता हूं लेकिन नहीं, जहां 'entry_id' हिस्सा आता है? मैं उम्मीद कर रहा था कि आप उसे समझा सकते हैं? मैं उपरोक्त मेरे कोड के प्रासंगिक "सम्मिलित" खंड में पेस्ट करूंगा। –