Также возможно, что в файле persistence.xml использовался EmbeddedDriver, в то время как URL-адрес jdbc указывал на сервер Derby. В этом случае просто измените url на указание пути к базе данных.
Это начало. Неплохая практика - определять свои длинные строки вне кода, который их использует. Это способ разделить данные и поведение. Ваш первый вариант - неявно соединить строковые литералы, сделав их соседними:
("This is the first line of my text, "
"which will be joined to a second.")
или с окончаниями строк, что немного хрупче, так как это работает:
"This is the first line of my text, " \
"which will be joined to a second."
Но это не:
"This is the first line of my text, " \
"which will be joined to a second."
Видите разницу? Нет? Ну, и вы не увидите, когда это будет ваш код.
Недостатком неявного соединения является то, что оно работает только со строковыми литералами, а не со строками, взятыми из переменные, так что вещи могут стать немного более волосатыми, когда вы рефактор. Кроме того, вы можете интерполировать форматирование только на объединенной строке в целом.
Альтернативно, вы можете объединиться явно, используя оператор конкатенация (+
):
("This is the first line of my text, " +
"which will be joined to a second.")
Явное лучше, чем неявное, как говорит дзен питона, но это создаёт три строки вместо одной и использует вдвое больше памяти: есть две, которые вы записали, плюс одна, которая состоит из двух, соединённых вместе, так что вы должны знать, когда игнорировать дзен. Положительная сторона заключается в том, что вы можете применить форматирование к любой из подстроек отдельно на каждой строке, или на всю партию за пределами скобок.
Наконец, вы можете использовать строки в тройных кавычках:
"""This is the first line of my text
which will be joined to a second."""
Это часто моя любимая строка, хотя ее поведение немного отличается, так как в последней строке будут появляться новые строки и любые ведущие пробельные символы на последующих строках. Вы можете удалить новую строку с помощью экранирующего обратного слеша.
"""This is the first line of my text \
which will be joined to a second."""
В этом есть та же проблема, что и при использовании той же техники, описанной выше, в том, что корректный код отличается от некорректного только невидимыми пробелами.
Какой из них "лучший" зависит от вашей конкретной ситуации, но ответ не просто эстетический, а один из тонко отличающихся друг от друга поведений.
Лично я не люблю повесить открытые блоки, поэтому я отформатирую его как:
logger.info(
'Skipping {0} because its thumbnail was already in our system as {1}.'
.format(line[indexes['url']], video.title)
)
В целом я бы не стал беспокоиться слишком сложно, чтобы код соответствовать точно в пределах 80 столбцов. Стоит держать длину линии до разумных уровней, но жесткий 80 предел - это вещь прошлого.
К последовательным строковым литералам присоединяется компилятор, и заключенные в скобки выражения считаются одной строкой кода:
logger.info("Skipping {0} because it's thumbnail was "
"already in our system as {1}.".format(line[indexes['url']],
video.title))