LINUX.ORG.RU

postgres и связанные таблицы

 ,


0

2

В двух словах:
есть таблица «альбом» и есть таблица «песни», где одно поле связано с тб Альбом (cascade на pk). Надо добавлять в привязанную таблицу «песни» поле с PK? А то в документации потерялся совсем.

Ответ на: комментарий от masterdilly

Да. Потом, возможно, придётся выделить словарь жанров и ещё что-нибудь.

hobbit ★★★★★
()
Ответ на: комментарий от theNamelessOne

О великие знатоки! А файлы, файлы как вы храните? Я так понимаю, что в таблице пишу song_url, а он смотрит уже в папку. Заливаю request.files().

Только вот пишут, что легче (правильнее) искать файл по id. Это что? Выстраивают их по папкам? Средствами, допустим, Питона?

Ну и прочёл о varchar и text. Разницы вроде и нет. Но люди советуют пользоваться http://gray-hemp.blogspot.ru/2010/03/charx-varcharx-varchar-text.html таким способом. Оно надо?

masterdilly
() автор топика
Ответ на: комментарий от masterdilly

О великие знатоки! А файлы, файлы как вы храните? Я так понимаю, что в таблице пишу song_url, а он смотрит уже в папку. Заливаю request.files().

Файлы храню в S3, в БД храню только basename файла, URL файла строится в приложении.

Только вот пишут, что легче (правильнее) искать файл по id.

Что ты понимаешь под «искать файл по id»? Искать где?

Средствами, допустим, Питона?

Не использую питон.

Но люди советуют пользоваться http://gray-hemp.blogspot.ru/2010/03/charx-varcharx-varchar-text.html таким способом. Оно надо?

А я знаю, надо ли оно тебе? По поводу валидаций в БД я уже высказался.

theNamelessOne ★★★★★
()
Ответ на: комментарий от masterdilly

Лучше не привязываться к урл т.к он может измениться.
Вариантов много на самом деле, зависит от того что требуется вашему приложению.
Мне нравится такой:
Для имени файла используем его хэш, от этого хэша берем первые n символов и создаем n поддиректорий от этого набора, дабы файлы равномерно легли в фс.
В базе сохраняем так же оригинальное название если нужно и тот сгенерированный путь.
Ну, а далее ссылку строим в приложении как обычно.

ritsufag ★★★★★
()
Последнее исправление: ritsufag (всего исправлений: 1)
Ответ на: комментарий от masterdilly

Зависит от требуемого уровня. Например можно брать первые четыре символа и бить на две директории по два символа.
Хотя я бы особо не заморачивался, если не ожидается большая файлопомойка, то достаточно сохранять в виде /год/месяц/ если все же в месяц десятки тысяч загрузок, можно добавить еще и день в этот путь.

ritsufag ★★★★★
()
Последнее исправление: ritsufag (всего исправлений: 1)
Ответ на: комментарий от theNamelessOne

Ты готов дать оценку, насколько валидация в БД будет быстрее?

Теперь я готов дать ответ ;)) Если приложение пишется не на компилируемых языках, то «Любая» валидация в БД будет быстрее ;)

В переводе на русский: любой код на питоне, идентичный встроенным функциям, будет медленнее, так как встроенные функции написаны на Си.

masterdilly
() автор топика
Ответ на: комментарий от ritsufag

Прошу помощи, новый тред не создаю.
Есть ли пример кода, как мы строим запрос на файл?
url_for('upload_song', path=song.song_path, filename=song.song_hash)
а в основном:
@app.route('/<path>/<filename>') — думаю,неправильно
def upload_song(path, filename): — дальше send_from_directory()

Короче, так я отдавать файлы и не научился.

masterdilly
() автор топика
Ответ на: комментарий от masterdilly

Теперь я готов дать ответ

Я не спрашивал, где валидация будет быстрее. Прочитай вопрос ещё раз:

Ты готов дать оценку, насколько валидация в БД будет быстрее? Сможешь ли ты заметить разницу «на глаз»?

theNamelessOne ★★★★★
()
Ответ на: комментарий от masterdilly

А зачем отдавать файлы приложением(кроме случаев где нужна авторизация)?
К тому же не стоит доверять расширениям файлов. Там может быть что угодно.

ritsufag ★★★★★
()
Ответ на: комментарий от ritsufag

расширения прверяются. Я не знаю, как передавать путь... Что-то сделал. теперь работает. Но всё равно, не понятно мне. В любом случае, спасибо.

masterdilly
() автор топика
Ответ на: комментарий от theNamelessOne

Тестов просто нет ;) Пока до этого не дошло.

masterdilly
() автор топика
Ответ на: комментарий от ritsufag

именно:

ALLOWED_IMG = {'png', 'jpg', 'jpeg', 'gif'}
ALLOWED_MEDIA = {'wav', 'mp3', 'flac', 'ogg'}


def save_file(file):
    # Validation filename
    ext = file.filename.rsplit('.', 1)[1].lower()
    if '.' in file.filename and ext in ALLOWED_IMG:
        path = UPLOAD_IMG
    elif '.' in file.filename and ext in ALLOWED_MEDIA:
        path = UPLOAD_MEDIA
    else:
        return False

masterdilly
() автор топика
Ответ на: комментарий от ritsufag

Ну и что предлагаешь? Просто о такой безопасности я не задумывался (слишком много тем надо было просмотреть).

masterdilly
() автор топика
Ответ на: комментарий от masterdilly

Зависит от того какой уровень требуется. Обычно достаточно несколько маркеров из хедера файла, но это не гарантирует 100% результат.
Дабы удостовериться что файл имеет именно тот контент который нужен нужно его декодировать. Да, это затратно и обычно не требуется приложению.
Для первого варианта тебе нужна любая библиотека, которая работает с «магическим байтами», есть как нативные, так и вызывающие libmagic под капотом.
Думаю есть для питона что-то типа filemagic или еще что. Хотя для небольшого кол-ва типов можешь ограничиться своим костылем с маркерами.
Для второго варианта разумеется нужны библиотеки для работы с данным типом(imagemagick/ffmpeg etc.).
Так же я вижу что ты хочешь загружать mp3, и это тоже нетривиальная задача т.к в большинстве случаев у них неверные хедеры.
Но это я так, просто к сведению. На данном этапе разработки тебе об этом думать ненужно.

ritsufag ★★★★★
()
Ответ на: комментарий от ritsufag

Было время, сам подставлял .com файлы (dos). Веселил народ ;) Спасибо за разъяснения. Надо будет почитать на досуге, чтобы иметь представление, как сейчас борьба с этим явлением идёт.

masterdilly
() автор топика
Ответ на: комментарий от ritsufag

Вообще, по многим фукнциям flask есть 24 примера ;) там натыкался на явно примеры из «серьёзного» кода. Проверка шла по mime type. Кто-то заморачивался дальше, но таких на 24 - 1.

masterdilly
() автор топика
Ответ на: комментарий от masterdilly

у тебя в save_file() нет проверки на isFileExist
подумай над тестами, какая разница как ты будешь проигрывать файлы из браузера, если код пишешь на «и так сойдёт»
в итоге превратишься в u0atgKIRznY5

system-root ★★★★★
()
Ответ на: комментарий от system-root

upd: аргументирую получше.
если проверять isFileExist, то можно сообщать пользователю об успехе, но не сохранять файл лишний раз.
через это можно представить, что в один альбом возможно засунуть одинаковые треки в разных форматах с разным хэшем, и тут уже думать о крайних ситуациях.
например отвергнуть идею, что трек в альбоме уникальный или придумать «замещать» mp3 другим форматом или ещё чего.
главное, что такие мысли редко приходят если

«херак херак и в продакшн, так сойдёт»
«буду тестить ввод с помощью слов test test и тогда varchar(20) норм вообще»

но какой-нибудь «TDD» может изменить видение крайних ситуаций.

system-root ★★★★★
()
Последнее исправление: system-root (всего исправлений: 1)
Ответ на: комментарий от system-root

Спасибо, я задумывался, так как при тестировании (тыком) брал несколько треков. Понятно, что иногда ругался на FileExist. Но тут сыграло то, что я специально для этого крутил hash. Но всё равно надо обратить внимание, пользователь ведь не дремлет.

masterdilly
() автор топика
Ответ на: комментарий от system-root

Код пишу ну точно не «на так сойдёт». Во первых - ленив. Смотреть на то, что написал, особенно при обучении, когда каждую неделю меняется качество написания - это пытка. Во вторых - темы, которые затронуты в данном задании. Повторю: вся обработка была написана на Django за день по тьюториалу (https://github.com/buckyroberts/Viberr, видео у него годные), но глубокого понимания и удовольствия процесс не принёс. Если бы я писал на отцепись, то упор был бы сделан на bootstrap, рюшечки, остальной front-end.

masterdilly
() автор топика
Ответ на: комментарий от pawnhearts

спасибо, смотрю. Что-то голова повернулась в сторону бритья. На ЛОРе вроде обсуждали. Странно, на таком деле - понту...

masterdilly
() автор топика
Ответ на: комментарий от masterdilly

Во фласк есть поддержка этой фичи, так что гугли на эту тему.

pawnhearts ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.