astrodbtoolkit / astrodbtoolkit/AstrodbKit

Empty JSON array ([]) as a lookup-table reference file causes a confusing IntegrityError in load_table()

Đang mở Phù hợp với người mới
#110 0 bình luận 0 reaction 0 người được giao Xem trên GitHub
Ngôn ngữ chính
Python
Star
12
Fork
5
Chỉ số merge pull request
Không có pull request nào được merge trong 30 ngày

Mô tả

**Where:** `astrodbkit.astrodb.Database.load_table()` does `conn.execute(self.metadata.tables[table].insert().values(data))` where `data` comes straight from `json.load()`. If the JSON file's top-level array is empty (`[]`), SQLAlchemy's `insert().values([])` is interpreted as "insert one row using column defaults" (a known SQLAlchemy quirk: an empty list to a multi-row `.values()` isn't a no-op), not "insert nothing."

**What happened:** After emptying `Publications.json`, `SourceTypeList.json`, and `ParameterList.json` to `[]` (clearing stale template-example placeholder rows before real data existed), `build_db_from_json()` failed with `sqlite3.IntegrityError: NOT NULL constraint failed: Publications.reference` — a single default-valued row was attempted, which violated the non-nullable `reference` column. The error message gives no hint that the root cause was an empty-array JSON file rather than a real data problem.

**Workaround:** Deleted the three now-empty JSON files entirely instead of leaving them as `[]` — `load_table()`'s existing `if os.path.exists(filename):` guard cleanly skips a missing file (with an optional verbose "not found" message), which is the actual correct way to represent "no data yet" for a reference table.

**Suggested change:** `Database.load_table()` should special-case `if not data: return` before calling `insert().values(data)`, so an empty-array reference file is a documented no-op instead of an inserted row of column defaults that then trips downstream NOT NULL constraints.

**Cross-filed:** Also filed against the [astrodb-bot](https://github.com/astrodbtoolkit/astrodb-bot) skills repo as [astrodbtoolkit/astrodb-bot#99](https://github.com/astrodbtoolkit/astrodb-bot/issues/99), which documents the same gotcha from the skill-user workaround side; this issue is for the actual `astrodbkit` fix.

---
_Reported from a gotchas.md log filed by a skill user (2026-08-28)._

Hướng dẫn đóng góp

Chưa lập chỉ mục được hướng dẫn đóng góp cho kho mã nguồn này

Hướng nghiên cứu

Start in astrodbkit.astrodb.Database.load_table(), where data from json.load() is passed to insert().values(data). Reproduce the behavior with a top-level [] reference-table file and follow build_db_from_json(); done means the empty file is treated as a no-op and no default-valued row or IntegrityError is produced.

Do mô hình lập chỉ mục viết ra từ nội dung của issue.

Đánh giá

Công nghệ
python, sqlalchemy
Lĩnh vực
databases
Loại issue
Lỗi
Độ khó
2/5
Thời gian dự kiến
1-3 giờ
Mức độ hoạt động
Sôi nổi
Độ rõ ràng
Đặc tả rõ ràng
Mức phù hợp với người mới
84/100

Nhận issue mới trong hộp thư của bạn

Bản tóm tắt ngắn những issue GitHub phù hợp với người mới.