Как делают меня объемная вставка с SQLite?

Я нахожу простой способ сделать это. Он сохраняет данные 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
7
задан Peter Mortensen 4 July 2010 в 12:36
поделиться

2 ответа

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, я могу заставить его неправильно диагностировать, что отсутствующий столбец - это наблюдатель , хотя этот столбец на самом деле в порядке. Хотите попробовать вернуть этот исправленный код на свой любимый язык и посмотреть, как он себя ведет?

2
ответ дан 6 December 2019 в 23:13
поделиться

Я написал класс, помогающий облегчить массовую вставку в SQLite. Надеюсь, это поможет:

http://procbits.com/2009/09/08/sqlite-bulk-insert/

-JP

8
ответ дан 6 December 2019 в 23:13
поделиться
Другие вопросы по тегам:

Похожие вопросы: