2013-09-16 4 views
4

Я ищу для хранения GUID в моей базе данных SQLite с использованием клиентов C# и python.Правильный способ хранения GUID в sqlite

Создание базы данных и вставки строки, сохраняя GUID в виде строки:

conn = sqlite3.connect(filename) 

c = conn.cursor() 

# Create the table. Yes, I know GUID isn't a real SQLite datatype. 
c.execute('CREATE TABLE test (guid GUID PRIMARY KEY, name text)') 

u = uuid.uuid4() 
print u 
t = (str(u), 'foo') 
c.execute('INSERT INTO test VALUES (?,?)', t) 

conn.commit() 
conn.close() 

Fetching:

# ... 
c.execute('SELECT * FROM test WHERE guid = "c3-6031-4ff7-b610-f8f3b940fa66"') 
print c.fetchone() 

Это все работает отлично. Использование представления Python __str__ UUID хорошо работает.

C:\Users\Jonathon>makedb.py test.db 
c3-6031-4ff7-b610-f8f3b940fa66 

C:\Users\Jonathon>opendb.py test.db 
(u'c3-6031-4ff7-b610-f8f3b940fa66', u'foo') 

Мои сомнения возникают от использования SQLite Expert. Оказывается, что SQLite Expert доволен моей GUID декларации типа данных:

enter image description here

Но, если я изменить строку:

enter image description here

, кажется, что она меняет тип данных! Мои SELECT еще до выходов None, и если я SELECT *, я не вижу, что это уже не простая юникода строка:

C:\Users\Jonathon>opendb.py test.db 
(<read-write buffer ptr 0x02239520, size 16 at 0x02239500>, u'foo') 

Глядя на данные на диске, вы можете увидеть, что GUID хранится в двоичная, после SQLite Expert трогает:

раньше - GUID является ASCII текст:

enter image description here

После - предыдущих данных мусор, и бинарная версия GUID существует:

enter image description here


Так что же такое «правильный» способ для хранения GUIDs в SQLite, в частности, с помощью Python? Позже у меня будет код C#, взаимодействующий с этим, а также хочу, чтобы я делал все правильно.

+0

D не делайте 'GUID' /' UUID' основным ключом, используйте отдельный внутренний идентификатор, особенно если вы собираетесь создавать отношения с внешним ключом, см. http://www.mail-archive.com/sqlite-users% 40sqlite.org/msg27377.html – DanielB

+0

SQLite (и, следовательно, SQLite Expert) довольны типом «GUID», потому что SQLite не применяет типы (кроме поля «INTEGER PRIMARY KEY»). – DanielB

+0

Хм, похоже, есть коллизия мнений: http://stackoverflow.com/questions/3272013/guid-as-uniq-key-with-sqlite –

ответ

6

Можно существенно добавить поддержку типов GUID для sqlite3 в Python.Вы можете зарегистрировать функции преобразования:

Чтобы использовать их, вам нужно передать аргумент для detect_types параметр connect().

Пример:

import sqlite3 
import uuid 

sqlite3.register_converter('GUID', lambda b: uuid.UUID(bytes_le=b)) 
sqlite3.register_adapter(uuid.UUID, lambda u: buffer(u.bytes_le)) 

conn = sqlite3.connect('test.db', detect_types=sqlite3.PARSE_DECLTYPES) 

c = conn.cursor() 
c.execute('CREATE TABLE test (guid GUID PRIMARY KEY, name TEXT)') 

data = (uuid.uuid4(), 'foo') 
print 'Input Data:', data 
c.execute('INSERT INTO test VALUES (?,?)', data) 

c.execute('SELECT * FROM test') 
print 'Result Data:', c.fetchone() 

Выход:

Input Data: (UUID('59cc2646-8666-4fb3-9f57-fe76e22603c0'), 'foo') 
Result Data: (UUID('59cc2646-8666-4fb3-9f57-fe76e22603c0'), u'foo') 

Результаты:

  • Я передаю uuid.UUID объекты непосредственно execute(). Адаптер lambda u: buffer(u.bytes) рассказывает sqlite3, как преобразовать те в buffer (что переводится как X'ABCD....' сгустка в SQLite.
  • fectchone() возвращается uuid.UUID объектов непосредственно. Преобразователь lambda u: buffer(u.bytes) говорит sqlite3, как создать те из массива байт, когда он сталкивается с объявленным тип GUID.
  • Этой GUIDs хранится в виде 16-байтовых блобы, в прямом порядке байт порядка.
  • Я могу успешно открыть/редактировать базы данных с помощью SQLite Expert (в конфигурации по умолчанию).
3

Ваш GUID - это строка. Объявите его как VARCHAR или CHAR, и он правильно подберет текст. Поскольку GUID не является типом, поле не имеет родства типа и, следовательно, будет иметь тип данных NONE.

Это описано здесь: http://www.sqlite.org/datatype3.html

Существует также краткое обсуждение кто-то пытается использовать Guid внутри SQLite Expert на их форуме поддержки здесь: http://sqliteexpert.com/forum/YaBB.pl?num=1368018774/0

поддержки переговоров о картографической системы и как измените отображение, а также инструмент, по умолчанию используемый для использования Blob.

+0

Так что же я вижу странное поведение SQLite Expert из-за моего объявления типа GUID? –

+0

Похож на это - я просто скачал и посмотрел. Если вы используете графический интерфейс для определения полей, он имеет «GUID» в качестве одного из параметров. – DanielB

+0

Да, в принципе, поскольку GUID является неизвестным типом, SQLite не может определить тип сродства к нему. – gview

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