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

时间:2014-05-10 16:05:24

标签: database sqlite python-3.x foreign-keys

大家好,

我在使用sqlite3和python3时遇到了一些麻烦。我想我再次遇到了那些愚蠢的时刻之一,但我正试图在下面制作下表。

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

Database relational view

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
          ''')

我得到的一条消息是 -

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.

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

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

1 个答案:

答案 0 :(得分:2)

  1. 如消息所示,您一次只能执行一条语句。
  2. 您只需执行PRAGMA foreign_keys一次连接即可。
  3. 执行BEGIN TRANSACTIOn在这里毫无意义。
  4. PRIMARY KEY约束已经暗示NOT NULL。
  5. PRIMARY KEY约束已经暗示UNIQUE。
  6. 如果表名包含空格,则必须引用它。
  7. 当您将外键声明为表约束时,必须在所有列之后写入,并且不得忘记分隔逗号。
  8. 将外键声明为列约束时,必须使用正确的语法:
  9. 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))
              ''')