Я нахожу простой способ сделать это. Он сохраняет данные json в 'SpiderName'.json с' utf8 '
from scrapy.exporters import JsonItemExporter
class JsonWithEncodingPipeline(object):
def __init__(self):
self.file = open(spider.name + '.json', 'wb')
self.exporter = JsonItemExporter(self.file, encoding='utf-8', ensure_ascii=False)
self.exporter.start_exporting()
def spider_closed(self, spider):
self.exporter.finish_exporting()
self.file.close()
def process_item(self, item, spider):
self.exporter.export_item(item)
return item
SQlite не поддерживает нотацию @variable, но (с использованием стиля именованного заполнителя, поддерживаемого привязкой sqlite Python для ясности) это должно работать:
INSERT INTO user_msg_media (userId, mediaId, catagory, current_media_date)
SELECT watcher, :mediaId, :category, :current_media_date
FROM userwatch WHERE watched=:watched
Изменить: SQLite, похоже, ошибочная диагностика того, какое имя столбца неверно. С фиксированными именами столбцов у меня работает следующий код Python (не уверен, какой другой язык вы используете, Python, который мне удобнее всего взаимодействовать с sqlite):
import sqlite3 as sq
con = sq.connect(':memory:')
cur = con.cursor()
cur.execute("CREATE TABLE if not exists user_msg_media( " +
"msgId INTEGER PRIMARY KEY, " +
"recipientId INTEGER, " +
"mediaId INTEGER, " +
"catagory INTEGER, " +
"current_date DATE)")
cur.execute("CREATE TABLE if not exists user_watch( " +
"indx INTEGER PRIMARY KEY, " +
"watcher INTEGER, " +
"watched INTEGER)")
cur.execute("INSERT INTO user_watch VALUES (1, 2, 3)")
cur.execute("SELECT watcher FROM user_watch WHERE watched=:watched",
dict(watched=3))
print cur.fetchall()
print cur.execute("INSERT INTO user_msg_media (recipientId, mediaId, catagory, current_date) " +
"SELECT watcher, :mediaId, :category, :current_media_date " +
"FROM user_watch WHERE watched=:watched;",
dict(mediaId=0, category=0, current_media_date=0, watched=3)
)
cur.execute("SELECT * FROM user_msg_media")
print cur.fetchall()
Но если я воспроизведу несоответствия в вашем SQL, например current_date vs current_media_date, я могу заставить его неправильно диагностировать, что отсутствующий столбец - это наблюдатель
, хотя этот столбец на самом деле в порядке. Хотите попробовать вернуть этот исправленный код на свой любимый язык и посмотреть, как он себя ведет?
Я написал класс, помогающий облегчить массовую вставку в SQLite. Надеюсь, это поможет:
http://procbits.com/2009/09/08/sqlite-bulk-insert/
-JP