python - 用peewee创建一个没有rowid的表
问题描述
我正在创建一个小型 python 程序,并使用 ORM peewee 来管理我的 Sqlite 数据库。我想使用 peewee 创建一个没有主键的表。问题是如果我没有指定一个主键,peewee 正在添加一个主键。阅读文档后,我发现参数 without_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 -使用-csv/
谢谢 !:)
解决方案
Peewee 文档也非常清楚如何禁用主键:
http://docs.peewee-orm.com/en/latest/peewee/models.html#models-without-a-primary-key
请阅读文档。
要创建没有主键的 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
推荐阅读
- python - If else with an and 条件不执行底层语句
- c# - 单击未调用的 UICollectionViewCell 中的特定元素(而是从 Source 触发的 ItemSelected)Xamarin.ios
- php - geoip_record_by_name 始终返回 null
- rxjs - 使用 Rxjs 将多个文件上传到 sftp 服务器
- python - 从 Iron Python 脚本中创建了一个 spk,但是当我执行它时出现错误:'NameError: global name 'Application' is not defined'
- python - 十进制(0.19)会导致很长的数字?
- jquery - How to inverse GSAP animation
- crashlytics - Crashlytics Generate Symbols gradle 步骤失败:GC Overhead Limit Exceeded
- java - 我无法阅读邮件内容
- heroku - How to correctly configure Heroku Custom Domain