簡體   English   中英

用peewee創建一個沒有rowid的表

[英]Create a table without rowid with peewee

我正在創建一個小型python程序,並使用ORM peewee管理我的Sqlite數據庫。 我想使用peewee創建一個沒有主鍵的表。 問題是如果我不指定peewee會添加一個主鍵。 閱讀文檔后,我發現參數no_rowid應該防止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)

與without_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 KEY,所以我需要通過在沒有主鍵的臨時表中導入csv文件來進行一些欺騙,如此處所述: http : //objectiveme.com/populating-a-sqlite-database -using-csv /

謝謝 ! :)

Peewee文檔也非常清楚如何禁用主鍵:

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

請閱讀DOCS。

要創建沒有主鍵的Peewee模型(與“ WITHOUT 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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM