2014-10-15 5 views
0

Я создал очень простое однопользовательское приложение базы данных с web2py для развертывания на настольном компьютере. Причина, по которой я выбираю web2py, объясняется ее простотой и неинтрузивным веб-сервером.Импорт данных csv в базу данных web2py и загрузки процессов

Моя проблема заключается в том, что мне нужно перенести существующую базу данных из другого приложения, которое я только что предварительно обработал и подготовил в файл csv, который теперь может быть полностью импортирован в базу данных sqlite в web2py.

Теперь у меня есть проблема с полем «загрузить» в одной из таблиц, которые соответствуют маленькому изображению, я сформировал это поле в csv с именем соответствующего файла .jpg, который Я вышел из исходной базы данных. Проблема в том, что мне не удалось правильно вставить их в папку для загрузки, так как движок web2py автоматически изменяет имя файла загрузки пользователей в безопасном формате, а копирование файлов прямо в папку не работает.

Мой вопрос: кто-нибудь знает, как правильно включить эту коллекцию изображений в папку uploads ?. Я не знаю, есть ли способ отключить эту защиту или мне придется вручную изменить свое имя на допустимый хэш. Я также рассмотрел идею кодирования процесса автоматической вставки в базу данных ...

Спасибо всем за внимание!

EDIT (рабочий пример):

Пример базы данных:

db.define_table('product', 
       Field('name'), 
       Field('color'), 
       Field('picture', 'upload'), 
       ) 

Затем с помощью модуля appadmin по умолчанию из моего приложения я импортировать файл CSV с записями вида:

product.name,product.color,product.picture 
"p1","red","p1.jpg" 
"p2","blue","p2.jpg" 

Тогда в моем приложении у меня есть обычная функция загрузки:

def download(): 
    return response.download(request, db) 

который я называю запрашивающий изображения, загруженные в базу данных, например, должны быть включены в вид:

<img src="{{=URL('download', args=product.picture)}}" /> 

Так что моя проблема в том, что у меня есть все изображения, соответствующие записи базы данных и I необходимо импортировать их в мое приложение, правильно включив их в папку uploads.

+0

Любой конкретный код, ввод, фактический и ожидаемый результат? –

+0

обновлен и пример существующего ввода и ожидаемого результата. Благодарю. – jarias

ответ

0

Если вы хотите, чтобы файлы назывались с помощью стандартного механизма загрузки файлов в формате Web2py (что является хорошей идеей по соображениям безопасности) и легко загружаются с помощью встроенного метода response.download(), вы можете сделать что-то вроде следующего.

В /yourapp/controllers/default.py:

def copy_files(): 
    import os 
    for row in db().select(db.product.id, db.product.picture): 
     picture = open(os.path.join(request.folder, 'private', row.picture), 'rb') 
     row.update_record(picture=db.product.picture.store(picture, row.picture)) 
    return 'Files copied' 

Затем поместите все файлы в/YourApp/отдельный каталог и перейти к URL/по умолчанию/copy_files (вам нужно только сделать это один раз). Это скопирует каждый файл в каталог/uploads и переименует его, сохранив новое имя в поле db.product.picture.

Обратите внимание, что вышеуказанная функция не должна быть действием контроллера (хотя, если вы это сделаете, вы должны удалить функцию, когда закончите).Вместо этого это может быть сценарий, который вы запускаете через командную строку web2py (должен быть запущен в среде приложения, чтобы иметь доступ к соединению и модели базы данных, а также ссылку на соответствующую папку/uploads) - в этом случае , вам нужно будет позвонить db.commit() в конце (это не обязательно во время HTTP-запросов).

В качестве альтернативы вы можете оставить вещи такими, какие они есть, и вместо этого (а) управлять загрузками и загрузками вручную вместо того, чтобы полагаться на встроенные механизмы web2py или (b) создавать функции custom_store и custom_retrieve (к сожалению, я не думаю они хорошо документированы) для поля picture, которое обходит функции встроенного хранения и извлечения web2py. Жизнь, вероятно, будет проще, хотя, если вы просто пройдете одноразовый процесс, описанный выше.

+0

Спасибо, что поставил меня на правильный путь. У меня были некоторые проблемы в начале, как этот подход дает мне следующую ошибку: AttributeError: объект «Row» не имеет атрибута «update_record» Однако я изменил запрос: 'для строки в БД (db.product .id> 0) .select(): ' , и тогда это сработало хорошо. Также я добавил 'db.commit()' в конце скрипта, поскольку изменения отображались неправильно. – jarias

+0

Извините, я забыл включить в поле «id» поле (я обновил ответ с этим исправлением) - вам не нужно выбирать все поля. Что касается 'db.commit()', это не обязательно в моем примере, но вы правы, что это необходимо при запуске кода как скрипта. – Anthony

Смежные вопросы