SQLite3 + Python3 - 使用外键创建数据库

Oll*_*lie 4 database sqlite foreign-keys python-3.x

大家好,

我在使用 sqlite3 和 python3 时遇到了一些问题。我想我又经历了那些愚蠢的时刻之一,但我基本上正在努力制作下表。

症结似乎是外键 - 我做错了什么,但我还没有完全弄清楚是什么 - 而且我的谷歌搜索并没有真正让我到任何地方。我找不到任何好的文档。我已经尝试了多种不同的在线外键语法,但没有一个能让我更接近工作表。

数据库关系视图

c.execute('''
          CREATE TABLE Driver (
          ID INTEGER PRIMARY KEY NOT NULL UNIQUE AUTOINCREMENT,
          FirstName text,
          LastName text,
          RegistrationNo text)
          ''')

c.execute('''
          CREATE TABLE Passenger (
          ID INTEGER PRIMARY KEY NOT NULL UNIQUE AUTOINCREMENT,
          FirstName text,
          LastName text)
          ''')

c.execute('''
          pragma foreign_keys=on;
          begin transaction;

          CREATE TABLE Journey (
          ID INTEGER PRIMARY KEY NOT NULL UNIQUE AUTOINCREMENT,
          Driver_ID INTEGER NOT NULL
          FOREIGN KEY (Driver_ID) REFERENCES Driver,
          Origin text,
          Destination text,
          SeatsAvailable integer,
          Date text,
          Time text,
          DriverNotes text,
          PassengerNotes text)
          ''')

c.execute('''
          pragma foreign_keys=on;
          begin transaction;

          CREATE TABLE Assigned Passengers (
          ID INTEGER PRIMARY KEY NOT NULL UNIQUE AUTOINCREMENT,
          Journey_ID INTEGER NOT NULL
          FOREIGN KEY (Journey_ID) REFERENCES Journey,
          Passenger_ID INTEGER NOT NULL
          FOREIGN KEY (Passenger_ID) REFERENCES Passenger
          ''')
Run Code Online (Sandbox Code Playgroud)

我收到的消息之一是 -

Traceback (most recent call last):
File "/Users/Computer/Bitbucket/Python Project/sql.py", line 46, in <module>
    ''')
sqlite3.Warning: You can only execute one statement at a time.
Run Code Online (Sandbox Code Playgroud)

第 46 行位于 Journey 创建块的末尾。

预先感谢任何可以提供帮助的人:)

CL.*_*CL. 5

  1. 正如该消息告诉您的那样,您一次只能执行一个语句。
  2. PRAGMA foreign_keys您只需为连接执行一次。
  3. 执行BEGIN TRANSACTIOn在这里没有任何意义。
  4. PRIMARY KEY 约束已经意味着 NOT NULL。
  5. PRIMARY KEY 约束已经意味着 UNIQUE。
  6. 如果表名包含空格,则必须用引号引起来。
  7. 当您将外键声明为表约束时,必须将其写在所有列之后,并且一定不要忘记分隔逗号。
  8. 当您将外键声明为列约束时,必须使用正确的语法:
c.execute('''
          CREATE TABLE Journey (
              ID INTEGER PRIMARY KEY AUTOINCREMENT,
              Driver_ID INTEGER NOT NULL REFERENCES Driver(ID),
              Origin text,
              Destination text,
              SeatsAvailable integer,
              Date text,
              Time text,
              DriverNotes text,
              PassengerNotes text)
          ''')
c.execute('''
          CREATE TABLE Assigned_Passengers (
              ID INTEGER PRIMARY KEY AUTOINCREMENT,
              Journey_ID INTEGER NOT NULL REFERENCES Journey(ID),
              Passenger_ID INTEGER NOT NULL REFERENCES Passenger(ID))
          ''')
Run Code Online (Sandbox Code Playgroud)