2015-03-14 6 views
2

Я читаю цифры из разделенных запятыми текстовых файлов, где некоторые цифры находятся в форме 000000084. Эти файлы добавляются в messageclass, а затем помещаются в базу данных SQLite. Проблема в том, что SQLite сохраняет эти 000000084 как 84, хотя я создаю столбец таблицы как строку.Где мои ведущие нули?

файл_ввода

something,000000018,213123 
somethingelse,000000025,213123 

Создание базы данных: класс

def createDatabase(databasepath): 
    con = lite.connect(databasepath) 
    with con: 
     cur = con.cursor() 
     cur.execute("CREATE TABLE staticMessage(userid string)") 

Сообщение:

class StaticMessage: 
    def __init__ (self, userid): 
     self.userid = userid 

Распаковка сообщение из файла:

def extractStaticMessages(filepath): 
    global staticMessage 
    staticMessage = [] 
    lengths = [] 
    f = open(filepath, 'r') 
    for line in f: 
     newline = line.split(",") 
     message = StaticMessage(newline[1]) 
     staticMessage.append(message) 

Запись сообщения в базу данных:

def writeStaticToDatabase(databasepath): 
    con = lite.connect(databasepath) 
    con.isolation_level = None 
    with con: 
     cur = con.cursor() 
     cur.execute('BEGIN TRANSACTION') 
     for i in range(0, len(staticMessage)): 
      cur.execute("INSERT INTO staticMessage(userid) VALUES(?)", 
      (staticMessage[i].userid) 
     cur.execute('COMMIT') 

Когда я затем запросить мою базу данных с f.ex:

select userid from staticMessage where userid='000000084' 

я 84

Это основная неприятность для меня, потому что я хочу запросить мою базу данных, чтобы получить количество идентификаторов пользователя менее девяти цифр.

TL/DR: где мои ведущие нули идут при вставке в SQLite?

+0

Просто небольшое примечание, вы должны обязательно использовать ['csv'] (https://docs.python.org/2/library/csv.html), чтобы читать значения из файла, а не сворачивать свои собственные. И вы можете просто выполнить 'для сообщения в staticMessage:', не нужно индексировать 'range' и array. Можете ли вы показать, как вы показываете '84', когда говорите« Я получаю 84 »? Возможно, это может быть проблемой, а не тем, что данные хранятся в самой базе данных неправильно. Вы проверили в необработанных таблицах базы данных, чтобы убедиться, что он вставлен как «000000084»? – aruisdante

+0

Показать схему таблицы. –

+0

@aruisdante Спасибо за ваш ответ. Я получаю 84, выполнив запрос, показанный прямо над этим. Терминал ubuntu выводит 84. Но вы правы, возможно, что он действительно сохранен как следует, но он отключен в выходе. – bjornasm

ответ

3

SQLite не обеспечивает строгого ввода столбцов. Вместо этого SQLite использует что-то под названием типа affinity: есть тип памяти, который получен из вашего объявления столбца и некоторых внутренних правил, но вы можете очень хорошо хранить текст в цифрах и наоборот.

official documentation четко объясняет правила, которые будут определять тип, используемый для хранения данных:

Сродства столбца определяется заявленным типом колонны, в соответствии со следующими правилами в Показанный номер заказа:

  1. Если объявленный тип содержит строку «INT», ему присваивается сродство INTEGER.

  2. Если объявленный тип столбца содержит любую строку «CHAR», «CLOB» или «TEXT», то этот столбец имеет сходство TEXT. Извещение о том, что тип VARCHAR содержит строку «CHAR» и, таким образом, назначен TEXT.

  3. Если объявленный тип для столбца содержит строку «BLOB» или если тип не указан, то столбец имеет отношение NONE.

  4. Если объявленный тип для столбца содержит любую строку «REAL», «FLOA» или «DOUB», то столбец имеет истинную близость.

  5. В противном случае сродство ЧИСЛО.

Обратите внимание, что порядок правил для определения аффинности столбца является важным. Столбец, объявленный тип «CHARINT», будет соответствовать правилам 1 и 2, но первое правило имеет приоритет, поэтому сближение столбца будет INTEGER.

Поскольку ваш столбец объявлен как «строка», который не может быть выведен для одного определенного типа, SQLite попытается как можно дальше от правила 5 сохранить ваши данные как числовые. Поэтому удаляем ведущие нули , если значение можно преобразовать в числовое число.

Обратите внимание, что вы можете хранить текст (скажем: «T000000084») без каких-либо проблем - поскольку SQLite не сможет преобразовать его в числовое (предпочтительное сродство к типу), он сохранит его как текст вместо ,


Учитывая нашу особую потребность, вы должны объявить столбец с текстом сродства. А именно использование типа, содержащего строки CHAR, CLOB или TEXT (правило 2).

1

000000084 не является номером, 84 есть. Вы хотите сохранить их в поле данных TEXT в SQLite.

+0

Не можете ли вы просто нарисовать 'int ('000000084')'? –

+0

Спасибо за ваш ответ, я попробую это. – bjornasm

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