Я ищу для хранения 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 декларации типа данных:
Но, если я изменить строку:
, кажется, что она меняет тип данных! Мои 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 текст:
После - предыдущих данных мусор, и бинарная версия GUID существует:
Так что же такое «правильный» способ для хранения GUIDs в SQLite, в частности, с помощью Python? Позже у меня будет код C#, взаимодействующий с этим, а также хочу, чтобы я делал все правильно.
D не делайте 'GUID' /' UUID' основным ключом, используйте отдельный внутренний идентификатор, особенно если вы собираетесь создавать отношения с внешним ключом, см. http://www.mail-archive.com/sqlite-users% 40sqlite.org/msg27377.html – DanielB
SQLite (и, следовательно, SQLite Expert) довольны типом «GUID», потому что SQLite не применяет типы (кроме поля «INTEGER PRIMARY KEY»). – DanielB
Хм, похоже, есть коллизия мнений: http://stackoverflow.com/questions/3272013/guid-as-uniq-key-with-sqlite –