【问题标题】:SQLite3 + Python3 - creating a database with foreign keysSQLite3 + Python3 - 使用外键创建数据库
【发布时间】:2014-06-28 07:06:32
【问题描述】:

大家好,

我在使用 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
          ''')

我收到的一条消息是 -

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 行位于 Journey 创建块的末尾。

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

【问题讨论】:

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


    【解决方案1】:
    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))
              ''')
    

    【讨论】:

    • 感谢您所做的一切——您帮了大忙! :) 祝你有美好的一天!
    猜你喜欢
    • 1970-01-01
    • 2019-05-28
    • 1970-01-01
    • 2016-08-26
    • 1970-01-01
    • 1970-01-01
    • 2012-09-05
    • 1970-01-01
    • 2014-05-21
    相关资源
    最近更新 更多