Sto*_*ace 6 python database sqlite
我无法理解它.我想将字典的值插入到sqlite数据库中.
url = "https://api.flickr.com/services/rest/?method=flickr.photos.search&api_key=5f...1b&per_page=250&accuracy=1&has_geo=1&extras=geo,tags,views,description"
soup = BeautifulSoup(urlopen(url)) #soup it up
for data in soup.find_all('photo'): #parsing the data
dict = { #filter the data, find_all creats dictionary KEY:VALUE
"id_p": data.get('id'),
"title_p": data.get('title'),
"tags_p": data.get('tags'),
"latitude_p": data.get('latitude'),
"longitude_p": data.get('longitude'),
}
#print (dict)
connector.execute("insert into DATAGERMANY values (?,?,?,?,?)", );
connector.commit()
connector.close
Run Code Online (Sandbox Code Playgroud)
我的键id_p,title_p等和值我检索通过data.get.
但是,我无法插入它们.当我试着写id, title, tags, latitude, longitude在后面...DATAGERMANY values (?,?,?,?,?)", );我得到
NameError: name 'title' is not defined.
我尝试了dict.values,dict但随后它的说法table DATAGERMANY has 6 columns but 5 values were supplied.
添加另一个?给我错误(使用`dict.values):ValueError:参数是不支持的类型
这就是我创建数据库和表的方法.
#creating SQLite Database and Table
connector = sqlite3.connect("GERMANY.db") #create Database and Table, check if NOT NULL is a good idea
connector.execute('''CREATE TABLE DATAGERMANY
(id_db INTEGER PRIMARY KEY AUTOINCREMENT,
id_photo INTEGER NOT NULL,
title TEXT,
tags TEXT,
latitude NUMERIC NOT NULL,
longitude NUMERIC NOT NULL);''')
Run Code Online (Sandbox Code Playgroud)
即使没有value填入数据库,该方法也应该有效......这种情况也可能发生.
您可以使用命名参数并一次插入所有行executemany().
作为奖励,您将获得html解析和数据流水线逻辑的良好分离:
data = [{"id_p": photo.get('id'),
"title_p": photo.get('title'),
"tags_p": photo.get('tags'),
"latitude_p": photo.get('latitude'),
"longitude_p": photo.get('longitude')} for photo in soup.find_all('photo')]
connector.executemany("""
INSERT INTO
DATAGERMANY
(id_photo, title, tags, latitude, longitude)
VALUES
(:id_p, :title_p, :tags_p, :latitude_p, :longitude_p)""", data)
Run Code Online (Sandbox Code Playgroud)
另外,不要忘记实际调用该close()方法:
connector.close()
Run Code Online (Sandbox Code Playgroud)
仅供参考,完整代码:
import sqlite3
from urllib2 import urlopen
from bs4 import BeautifulSoup
url = "https://api.flickr.com/services/rest/?method=flickr.photos.search&api_key=5f...1b&per_page=250&accuracy=1&has_geo=1&extras=geo,tags,views,description"
soup = BeautifulSoup(urlopen(url))
connector = sqlite3.connect(":memory:")
cursor = connector.cursor()
cursor.execute('''CREATE TABLE DATAGERMANY
(id_db INTEGER PRIMARY KEY AUTOINCREMENT,
id_photo INTEGER NOT NULL,
title TEXT,
tags TEXT,
latitude NUMERIC NOT NULL,
longitude NUMERIC NOT NULL);''')
data = [{"id_p": photo.get('id'),
"title_p": photo.get('title'),
"tags_p": photo.get('tags'),
"latitude_p": photo.get('latitude'),
"longitude_p": photo.get('longitude')} for photo in soup.find_all('photo')]
cursor.executemany("""
INSERT INTO
DATAGERMANY
(id_photo, title, tags, latitude, longitude)
VALUES
(:id_p, :title_p, :tags_p, :latitude_p, :longitude_p)""", data)
connector.commit()
cursor.close()
connector.close()
Run Code Online (Sandbox Code Playgroud)
按照书面说明,您的connector.execute()陈述缺少parameters参数。
应该这样使用:
connector.execute("insert into some_time values (?, ?)", ["question_mark_1", "question_mark_2"])
Run Code Online (Sandbox Code Playgroud)
除非以后需要字典,否则我实际上将使用列表或元组:
row = [
data.get('id'),
data.get('title'),
data.get('tags'),
data.get('latitude'),
data.get('longitude'),
]
Run Code Online (Sandbox Code Playgroud)
然后,您的插入语句变为:
connector.execute("insert into DATAGERMANY values (NULL,?,?,?,?,?)", *row)
Run Code Online (Sandbox Code Playgroud)
为什么会有这些变化?
NULL在values (NULL, ...)如此自动递增的主键将工作*row这样的五元row变量将扩大(见此处了解详情)。dict用作变量名,因为它是Python中的内置变量。| 归档时间: |
|
| 查看次数: |
8269 次 |
| 最近记录: |