我正在创建一个小型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)
peewee与no_rowid一样,会自动将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/
谢谢! :)
答案 0 :(得分:-1)
Peewee文档也非常清楚如何禁用主键:
http://docs.peewee-orm.com/en/latest/peewee/models.html#models-without-a-primary-key
请阅读DOCS。
要创建没有主键(与“ WITHOUT ROWID”明显不同)的Peewee模型,可以指定“ 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