Ошибка записи нераспознанного токена при записи файла csv в базу данных sqlite3 - PullRequest
0 голосов
/ 03 февраля 2019

Я пытаюсь записать содержимое csv-файла в базу данных sqlite3, но при создании базы данных и определении схемы я сталкиваюсь с нераспознанной ошибкой токена

# Connect to database
conn = sqlite3.connect('test.db')
# Create cursor
c = conn.cursor()
# Open CSV file
with open('500000 Records.csv', mode='r') as csv_file:
    csv_reader = csv.reader(csv_file, delimiter=',')
    line_count = 0
    for row in csv_reader:
        if line_count == 0:
            # Create table
            query = '''CREATE TABLE IF NOT EXISTS Employee({} INT, {} TEXT,
{} TEXT, {} TEXT, {} TEXT, {} TEXT, {} TEXT, {} TEXT, {} TEXT, {} TEXT,
{} TEXT, {} TEXT, {} TEXT, {} TEXT, {} TEXT, {} TEXT, {} TEXT, {} TEXT,
{} TEXT, {} TEXT, {} TEXT, {} TEXT, {} TEXT, {} TEXT, {} TEXT, {} TEXT,
{} TEXT, {} TEXT, {} TEXT)'''.format(*row)
            print(query)
            c.execute(query)

Это запросвыводится при выполнении строки print(query):

CREATE TABLE IF NOT EXISTS Employee(Emp ID INT, Name Prefix TEXT,
First Name TEXT, Middle Initial TEXT, Last Name TEXT, Gender TEXT, E Mail TEXT, Father's Name TEXT, Mother's Name TEXT, Mother's Maiden Name TEXT,
Date of Birth TEXT, Time of Birth TEXT, Age in Yrs. TEXT, Weight in Kgs. TEXT, Date of Joining TEXT, Quarter of Joining TEXT, Half of Joining TEXT, Year of Joining TEXT,
Month of Joining TEXT, Month Name of Joining TEXT, Short Month TEXT, Day of Joining TEXT, DOW of Joining TEXT, Short DOW TEXT, Age in Company (Years) TEXT, Salary TEXT,
Last % Hike TEXT, SSN TEXT, Phone No.  TEXT)

Это ошибка, которая возникает из строки c.execute(query):

Traceback (most recent call last):
  File "C:\Users\User\Google Drive\CSC443\A1\create_database.py", line 21, in <module>
    c.execute(query)
sqlite3.OperationalError: unrecognized token: "'s Maiden Name TEXT,
Date of Birth TEXT, Time of Birth TEXT, Age in Yrs. TEXT, Weight in Kgs. TEXT, Date of Joining TEXT, Quarter of Joining TEXT, Half of Joining TEXT, Year of Joining TEXT,
Month of Joining TEXT, Month Name of Joining TEXT, Short Month TEXT, Day of Joining TEXT, DOW of Joining TEXT, Short DOW TEXT, Age in Company (Years) TEXT, Salary TEXT,
Last % Hike TEXT, SSN TEXT, Phone No.  TEXT)"

sqlite3 имеет проблемы с "По какой-то причине в колонке "Девичья фамилия матери" я не могу понять.Это не первый символ апострофа;это будет в столбце «Имя отца».

1 Ответ

0 голосов
/ 03 февраля 2019

В основном у вас много проблем.

Сначала рассмотрите возможность удаления всех определений столбцов из синтаксической ошибки, например, используя: -

DROP TABLE IF EXISTS Employee;
CREATE TABLE IF NOT EXISTS Employee(Emp ID INT, Name Prefix TEXT,
First Name TEXT, Middle Initial TEXT, Last Name TEXT, Gender TEXT, E Mail TEXT, Father's Name TEXT, Mother'

/*s Name TEXT, Mother's Maiden Name TEXT,
Date of Birth TEXT, Time of Birth TEXT, Age in Yrs. TEXT, Weight in Kgs. TEXT, Date of Joining TEXT, Quarter of Joining TEXT, Half of Joining TEXT, Year of Joining TEXT,
Month of Joining TEXT, Month Name of Joining TEXT, Short Month TEXT, Day of Joining TEXT, DOW of Joining TEXT, Short DOW TEXT, Age in Company (Years) TEXT, Salary TEXT,
Last % Hike TEXT, SSN TEXT, Phone No.  TEXT
*/
)
;

SELECT * FROM Employee;

Созданная результирующая таблица имеет следующие столбцы: -

enter image description here

Я полагаю, что вы ожидали бы такие столбцы, как ï »¿Emp ID, префикс имени, имя и т. Д.

Имена столбцов (и имена в целом) не могут иметь встроенное пространствоесли имя не является подходящим приложенным.

Если теперь вы считаете все имена вложенными, например, согласно: -

DROP TABLE IF EXISTS Employee;
CREATE TABLE IF NOT EXISTS Employee(`Emp ID` INT, `Name Prefix` TEXT,
`First Name` TEXT, `Middle Initial` TEXT, `Last Name` TEXT, `Gender` TEXT, `E Mail` TEXT, `Father's Name` TEXT, `Mother's Name` TEXT, 
`Mother's Maiden Name` TEXT,
`Date of Birth` TEXT, `Time of Birth` TEXT, `Age in Yrs.` TEXT, `Weight in Kgs.` TEXT, `Date of Joining` TEXT, `Quarter of Joining` TEXT, `Half of Joining TEXT, Year of Joining TEXT,
Month of Joining` TEXT, `Month Name of Joining` TEXT, `Short Month` TEXT, `Day of Joining` TEXT, `DOW of Joining` TEXT, `Short DOW` TEXT, `Age in Company (Years)` TEXT, `Salary` TEXT,
`Last % Hike TEXT`, `SSN` TEXT, `Phone No.`  TEXT
)
;

SELECT * FROM Employee;

Результат: -

enter image description here

  • обратите внимание только на подмножество отображаемых столбцов

Короче говоря, из-за имен столбцов, включая пробелы, необходимо заключитьимена (идентификаторы) в соответствии с: -

SQL как понятно SQLite - ключевые слова SQLite

Конечно, использование таких имен / идентификаторов, вероятно, приведет только к продолжениюпроблем, и сомнительно, что многие рекомендовали бы использовать такие соглашения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...