2016-08-10 3 views
0

Ich brauche Hilfe beim Einfügen von Daten in SQLite mit Python.So fügen Sie Daten in SQLite mit Pythons-Wörterbuch ein

ich diesen Teil des Codes haben, um Daten in Tabelle einfügen, ist sqlDataDict Namen Wörterbuch:

cur.execute(''' INSERT INTO ProductAtt (imgID, productName, col1, col2, col3, col4, col5, col6, 
       col7, col8, col9, col10, col11, col12, col13, col14) 

      VALUES (:imgID, :productName, :col1, :col2, :col3, :col4,:col5, :col6, :col7, :col8, :col9, 
        :col10, :col11, :col12, :col13, :col14)''', sqlDataDict) 

Ich habe auch Sätze von Wörter wo Wörterbuch gleiche Anzahl von Schlüsseln und Werten haben nicht nach Looping,

Sobald wie folgt aussehen:

{'imgID': '451841', 'productName': 'product1', 'col1': 'data1', 'col2': 'data2', 'col3': 'data3', 'col4': 'data4', 'col5': 'data5', 
     'col6': 'data6', 'col7': 'data7', 'col8': 'data8', 'col9': 'data9', 'col10': 'data10', 'col11': 'data11', 'col12': 'data12', 'col13': 'data13', 
      'col14': 'data14'} 

Einmal zum Beispiel wie folgt aus:

012.351.
{'imgID': '451841', 'productName': 'product1', 'col1': 'data1', 'col4': 'data4', 'col5': 'data5', 
     'col6': 'data6', 'col7': 'data7', 'col8': 'data8', 'col9': 'data9', 'col10': 'data10', 'col11': 'data11', 'col13': 'data13', 
      'col14': 'data14'} 

Wenn in dict ich mich nicht einige Daten habe Massage

Eigentlich dict nicht gleich groß sind und mit gleichen Daten nach jeder Schleife „Sie können keinen Wert für die Bindung liefern haben“. Wie kann ich weitergeben, wenn ich nicht bestimmte Daten in dict habe?

EDIT: komplette Code:

import requests 
from bs4 import BeautifulSoup 
import sqlite3 

###---> Connection to SQLite database 
conn=sqlite3.connect('G:Folder/attributes.db') 
cur=conn.cursor() 

###---> DROP existing tables in databese 
cur.execute('DROP TABLE IF EXISTS ProductAtt') 

###--->Creating tabel's in databese 
cur.execute('''CREATE TABLE ProductAtt (imgID INTEGER PRIMARY KEY, productName TEXT, 
Col1 REAL, Col2 REAL, Col3 TEXT, Col4 TEXT, Col5 TEXT, Col6 REAL, 
Col7 TEXT, Col8 TEXT, Col9 TEXT, Col10 TEXT, Col11 TEXT, 
Col12 TEXT, Col13 TEXT, Col14 TEXT, Col15 TEXT)''') 


input_file=('G:Folder/urls.txt') 

###---> Loop linkova iz file-a 
with open(input_file) as line: 
    url=line.readlines()   
    #print(url) #---> TEST print line 

###---> BeautifulSoup for each URL from *.txt file 
    for singleUrl in url: 
     r=requests.get(singleUrl) 
     soup=BeautifulSoup(r.content, "lxml") 
     #print (soup) #---> TEST print line 

#============================================================================== 
# Retrieves image name [imgName] and product name [productName]     
#============================================================================== 
     get_dataImg = soup.find_all("div", {"class": "product-image"}) 

###---> Image name 
     for imgNameJpg in get_dataImg: 
      imgNameJpg = imgNameJpg.a['href'].split('/')[-1] 
      imgName = imgNameJpg.split('.')[0]    
      #print("imageID:", imgName) #---> TEST print line 

###--->Product name   
     get_dataName =soup.find_all("span", {"class": "product-name"})   
     for productName in get_dataName: 
      productName = productName.text 
      print("productName:", productName) #---> TEST print line 

###--->Dictionary imageID and productName 

     nameData = {"imgID": imgName, "productName": productName} 
     #print(nameData) #---> TEST print line 

#============================================================================== 
# Product attributes [productAttributes] i [productValues]   
#==============================================================================   
     get_attributeName = soup.find(True, {"class": ["product-attributes", "product-attribute-value"]}).find_all('li') 

###---> Dictionary   
     allDataDict = {}  
     for attData, attValues in get_attributeName: 
      attData=attData.split(':')[0] 
      attData=attData.split(' ')[0] 
      #print(attData)  #---> TEST print line 
      data = {attData: attValues.text}       
      allDataDict.update(data) 
     #print(allDataDict)  #---> TEST print line  

#============================================================================== 
# New Dictionary, two in one, nameData and allDataDict INTO sqlDataDict  
#============================================================================== 
     sqlDataDict = dict(list(nameData.items()) + list(allDataDict.items())) 
     #print(values) #---> TEST print line 

#============================================================================== 
# INTO SQLite  
#==============================================================================     

     columns = ','.join(sqlDataDict.keys()) 
     placeholders= ','.join('?' * len(sqlDataDict)) 
     sql = 'INSERT INTO ProductAtt ({}) VALUES ({})'.format(columns, placeholders) 
     cur.execute(sql, sqlDataDict.values()) 
     conn.commit() 

Antwort

1

Ich nehme an, das ist das, was Sie suchen:

values = {'col1':'val1','col2':'val2'}  

columns = ', '.join(values.keys()) 
placeholders = ', '.join('?' * len(values)) 
sql = 'INSERT INTO Media ({}) VALUES ({})'.format(columns, placeholders) 
cur.execute(sql, tuple(values.values())) 
+0

habe ich nur den Code, wie Sie vorgeschlagen: 'Spalten =‘, '.join (sqlDataDict.keys()) Platzhalter =', '. join ('? '* len (sqlDataDict)) sql =' INSERT IN ProductAtt ({}) VALUES ({}) '. Platzhalter) cur.execute (SQL, sqlDataDict.values ​​()) ' Aber Ergebnis ist: ** Valueerror: Parameter von nicht unterstützten Typ sind ** in ' cur.execute (SQL, sqlDataDict.values ​​()) ' habe ich verpasst etwas? – CortoMaltese

+0

können Sie den ganzen Code senden? – harshil9968

+0

Natürlich habe ich meine Frage bearbeitet und Code dort eingegeben. – CortoMaltese

Verwandte Themen