#python #sqlite #pycharm
#python #sqlite #pycharm
Вопрос:
PyCharm. Вот код:
# db_create.py
#
# Create the database and tables
#
import sqlite3
from config import DATABASE_PATH
with sqlite3.connect(DATABASE_PATH) as connection:
cursor = connection.cursor()
# Create table
cursor.execute("""
CREATE TABLE ftasks(
task_id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT NOT NULL,
due_date TEXT NOT NULL,
priority INTEGER NOT NULL,
status INTEGER NOT NULL)
""")
# Insert dummy data into the table
cursor.execute("""
INSERT INTO ftasks (name, due_date, priority, status)
VALUES("Finish this tutorial", "02/03/2014", 10, 1)
""")
cursor.execute("""
INSERT INTO ftasks (name, due_date, priority, status)
VALUES("Finish Real Python Course 2", "02/03/2014", 10, 1)
""")
Код работает просто отлично. База данных создана, и все хорошо. Тем не менее, я получаю это сообщение в IDE. Не уверен, к чему это относится:
Я получил сообщение об ошибке, чтобы уйти, просто изменив этот код с того, как он отображается выше:
# Insert dummy data into the table
cursor.execute("""
INSERT INTO ftasks (name, due_date, priority, status)
VALUES('Finish this tutorial', '02/03/2014', 10, 1)
""")
cursor.execute("""
INSERT INTO ftasks (name, due_date, priority, status)
VALUES('Finish Real Python Course 2', '02/03/2014', 10, 1)
""")
Единственное изменение — использовать одинарные кавычки внутри инструкции SQL.
Почему версия, заключенная в двойные кавычки, является неразрешенной ссылкой?
Я должен отметить, что обе версии кода приводят к точно такому же файлу базы данных и содержимому.
Дальнейшие исследования, основанные на предположении, что двойные кавычки внутри тройных кавычек могут вызывать проблемы с редактором / анализатором PyCharm.
Я попробовал этот код в редакторе:
a = """
INSERT INTO atable (column1, column2)
VALUES ("test",'test')
"""
b = """
BLAH BLAH atable (column1, column2)
BLAH ("test",'test')
"""
а также запустил его в командной строке Python:
>>> a = """
INSERT INTO atable (column1, column2)
VALUES ("test",'test')
"""
>>> b = """
BLAH BLAH atable (column1, column2)
BLAH ("test",'test')
"""
>>> a
'nINSERT INTO atable (column1, column2)nVALUES ("test",'test')n'
>>> b
'nBLAH BLAH atable (column1, column2)nBLAH ("test",'test')n'
Оба приведенных выше определения создают строки с точно такой же структурой. Я не вижу никаких проблем, связанных с использованием двух типов кавычек внутри строки с тройными кавычками ни в командной строке Python, ни в режиме ОЖИДАНИЯ, ни в PyCharm.
У редактора IDE есть проблема только со строковой SQL-версией строки, а не с другой:
Если я наведу указатель на коричневые выделения, я получу сообщение об ошибке. Версия «БЛА-БЛА-БЛА» не имеет проблем.
Это говорит мне, что это как-то связано с SQL / SQLite. Верно?
Ответ №1:
Когда вы используете двойные кавычки внутри строки, ограниченной """
, вы напрашиваетесь на неприятности.
Python способен обрабатывать двойные кавычки в подобных ситуациях, но, похоже, вашему редактору это не нравится — скорее всего, ваш редактор использует более простой синтаксический анализатор, чем интерпретатор Python, и блокирует строку в формате """ x"x """
.
«Неразрешенная ссылка» в этом контексте означает, что PyCharm считает, что слово Finish
является ссылочной переменной, поскольку оно ошибочно полагает, что двойная кавычка завершает вашу строку. Конечно, у вас нет именованной ссылочной переменной Finish
.
Комментарии:
1. Спасибо за ваш ответ. Я протестировал пару вещей, основанных на вашей идее, и обновил вопрос дополнительной документацией. Я был бы признателен за ваши мысли по этому поводу.
2. Хотя этот ответ может быть правильным для всех (что Pycharm путают строки в тройных кавычках), ваш FYI в конце немного вводит в заблуждение. Тип кавычек, которые Python использует в
repr
строке, не имеет ничего общего с кавычками, которые использовались программистом для записи строкового литерала каким-либо образом. Текущийrepr
алгоритм таков: «если в строке есть одинарные кавычки и нет двойных кавычек, заключите в двойные кавычки, в противном случае заключите в одинарные кавычки». Я считаю, что это деталь реализации, поэтому вам, вероятно, не следует полагаться на нее.3. @martin’s: какие бы кавычки ни отображались в Python
repr
, они не имеют абсолютно никакого отношения к тому, какие кавычки использовались при создании строки. Если вы начинаете строку в тройных кавычках с «»», вам лучше закончить ее на «»».4. Итак, вы говорите, что в
repr
тройных кавычках просто происходит изменение состояния, которое возвращается назад, как только анализатор видит другой набор тройных кавычек? ОК. Я понимаю это. Тем не менее, PyCharm не жалуется на точно такую же строковую структуру, если я изменяю токены SQL на «БЛА». Таким образом, на самом деле это не смущает — по крайней мере, не в этом примере — различными комбинациями кавычек — кажется, — но скорее у него есть проблема с комбинацией кавычек при использовании в контексте инструкции SQL. В этом контексте, что именно является неразрешенной ссылкой?5. Кстати, спасибо за разъяснение. Я довольно новичок в Python, но занимаюсь разработкой программного обеспечения уже более двадцати лет. Всегда здорово узнавать что-то новое.
Ответ №2:
Получил ответ от JetBrains. Это ошибка. Они работают над этим.
Комментарии:
1. номер ошибки было бы полезно поделиться