Создать таблицу без rowid с peewee - PullRequest
0 голосов
/ 29 января 2019

Я создаю небольшую программу на Python и использую программу ORM для управления моей базой данных Sqlite.Я хочу создать таблицу без первичного ключа, используя peewee.Проблема в том, что peewee добавляет первичный ключ, если я его не указал.После прочтения документации я обнаружил параметр без_уданного, который должен был предотвратить создание этого первичного ключа.Но это не работает.

Вот небольшой пример кода:

#!/usr/bin/python
import peewee
import traceback

db_proxy = peewee.Proxy()
class BaseModel(peewee.Model):
    class Meta:
        database = db_proxy

class table1(BaseModel):
    id = peewee.IntegerField(primary_key=True)
    field1 = peewee.CharField()
    field2 = peewee.IntegerField()

class table2(BaseModel):
    table1_id = peewee.IntegerField()
    field1 = peewee.CharField()
    class Meta:
        without_rowid = True

try:
    # create database
    db = peewee.SqliteDatabase("test.db")
    db_proxy.initialize(db)
    db.create_tables([table1, table2])
except Exception as e:
    traceback.print_exc(e)

То же, что и безless_rowid, peewee автоматически добавляет первичный ключ id в мою таблицу table2.Вот схема созданной базы данных:

CREATE TABLE IF NOT EXISTS "table1"(
  "id" INTEGER NOT NULL PRIMARY KEY,
  "field1" VARCHAR(255) NOT NULL,
  "field2" INTEGER NOT NULL
);
CREATE TABLE IF NOT EXISTS "table2"(
  "id" INTEGER NOT NULL PRIMARY KEY,
  "table1_id" INTEGER NOT NULL,
  "field1" VARCHAR(255) NOT NULL
) WITHOUT ROWID;

Вы знаете способ решить эту проблему и разрешить мне создать таблицу без rowid?

ps: если вы спрашиваете, почему я хочу создать таблицу без первичного ключа, это потому, что мне нужно вставить данные из файла CSV.(sqlite3 database.db ".mode csv" ".import file.csv table1").Поскольку у меня в таблице есть ключ AUTO INCREMENT PRIAMRY, мне нужно немного обмануть, импортировав CSV-файл во временную таблицу без первичного ключа, как описано здесь: http://objectiveme.com/populating-a-sqlite-database-using-csv/

Спасибо!:)

1 Ответ

0 голосов
/ 29 января 2019

Документация Peewee также ОЧЕНЬ ЯСНА, как отключить первичный ключ:

http://docs.peewee -orm.com / ru / latest / peewee / models.html # models-without-a-primary-key

Пожалуйста, ПРОЧИТАЙТЕ ДОКУМЕНТЫ.

Чтобы создать модель Peewee без первичного ключа (который заметно отличается от «БЕЗ ROWID»), вы можете указать «primary_key = False»":

class NoPKModel(Model):
    key = TextField()
    data = TextField()
    class Meta:
        primary_key = False

Это не автоматически создаст поле" id ".

Без ROWID - оптимизация SQLite с довольно специфическим сценарием использования.Пожалуйста, прочтите документацию по SQLite и ознакомьтесь с моделью данных SQLite перед ее использованием: https://www.sqlite.org/rowidtable.html

...