【问题标题】:What does sqlite3.OperationalError: near "-": syntax error mean?sqlite3.OperationalError: near "-": syntax error 是什么意思?
【发布时间】:2019-12-20 03:37:15
【问题描述】:

我正在尝试创建这些表,它给了我以下错误消息: Traceback(最近一次调用最后一次): 文件“D:/Programmieren/Python/PycharmProjects/untitled/Morningstar.py”,第 128 行,在 ''') sqlite3.OperationalError:靠近“-”:语法错误

cur.execute('''
CREATE TABLE GuVY1(
    id                                          INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT UNIQUE,
    Ertrag                                      INTEGER,
    Betriebskosten                              INTEGER,
    Bruttobetriebsgewinn                        INTEGER,
    Betriebsausgaben                            INTEGER,
    Forschung und Entwicklung                   INTEGER,
    Vertriebs- und Verwaltungskosten            INTEGER,
    Personalkosten                              INTEGER,
    Abschreibung und Abgrenzungen               INTEGER,
    Sonstige Betriebskosten                     INTEGER,
    Geschäftsaufwand                            INTEGER,
    Betriebseinnahmen vor Zinsen und Steuern    INTEGER,
    Neutrale Erträge                            INTEGER,
    Gewinn vor Einkommenssteuer                 INTEGER,
    Steueraufwand                               INTEGER,
    Nettogewinn für weitere Geschäftstätigkeit  INTEGER,
    Nettogewinn                                 INTEGER,
    Nettogewinn verfügbar für Aktionäre         INTEGER
)
''')

【问题讨论】:

  • 用双引号或反引号或方括号 [...] 将包含空格或符号(如 -)的列名括起来
  • @Ufo367 。 . .修正列名,使其仅使用字母、数字和下划线。不要给需要转义的列名。这只会使查询变得混乱,使它们更难理解。

标签: python sqlite


【解决方案1】:
Vertriebs- und Verwaltungskosten            INTEGER,

您不能直接在代码中添加破折号。相反,包装每个变量名称 在引号中(或删除破折号)。

"Vertriebs- und Verwaltungskosten"            INTEGER,

【讨论】:

    【解决方案2】:

    连字符不是 sql 列中的合法字符,因此需要屏蔽

    【讨论】:

      【解决方案3】:

      SQLite 可能是唯一一个使用良好且支持multiple forms of escaping 空格、符号/字符和关键字的 DBMS:

      双引号 (ANSI 标准,Oracle/DB2/Postgres/Teradata 使用)

      cur.execute('''
      CREATE TABLE "GuVY1" (
          "id"                                          INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT UNIQUE,
          "Ertrag"                                      INTEGER,
          "Betriebskosten"                              INTEGER,
          "Bruttobetriebsgewinn"                        INTEGER,
          "Betriebsausgaben"                            INTEGER,
          "Forschung und Entwicklung"                   INTEGER,
          "Vertriebs- und Verwaltungskosten"            INTEGER,
          "Personalkosten"                              INTEGER,
          "Abschreibung und Abgrenzungen"               INTEGER,
          "Sonstige Betriebskosten"                     INTEGER,
          "Geschäftsaufwand"                            INTEGER,
          "Betriebseinnahmen vor Zinsen und Steuern"    INTEGER,
          "Neutrale Erträge"                            INTEGER,
          "Gewinn vor Einkommenssteuer"                 INTEGER,
          "Steueraufwand"                               INTEGER,
          "Nettogewinn für weitere Geschäftstätigkeit"  INTEGER,
          "Nettogewinn"                                 INTEGER,
          "Nettogewinn verfügbar für Aktionäre"         INTEGER
      )
      ''')
      

      反引号 (用于 MySQL/MariaDB 兼容性)

      cur.execute('''
      CREATE TABLE `GuVY1` (
          `id`                                          INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT UNIQUE,
          `Ertrag`                                      INTEGER,
          `Betriebskosten`                              INTEGER,
          `Bruttobetriebsgewinn`                        INTEGER,
          `Betriebsausgaben`                            INTEGER,
          `Forschung und Entwicklung`                   INTEGER,
          `Vertriebs- und Verwaltungskosten`            INTEGER,
          `Personalkosten`                              INTEGER,
          `Abschreibung und Abgrenzungen`               INTEGER,
          `Sonstige Betriebskosten`                     INTEGER,
          `Geschäftsaufwand`                            INTEGER,
          `Betriebseinnahmen vor Zinsen und Steuern`    INTEGER,
          `Neutrale Erträge`                            INTEGER,
          `Gewinn vor Einkommenssteuer`                 INTEGER,
          `Steueraufwand`                               INTEGER,
          `Nettogewinn für weitere Geschäftstätigkeit`  INTEGER,
          `Nettogewinn`                                 INTEGER,
          `Nettogewinn verfügbar für Aktionäre`         INTEGER
      )
      ''')
      

      方括号 (用于 SQL Server/MS Access 兼容性)

      cur.execute('''
      CREATE TABLE [GuVY1] (
          [id]                                          INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT UNIQUE,
          [Ertrag]                                      INTEGER,
          [Betriebskosten]                              INTEGER,
          [Bruttobetriebsgewinn]                        INTEGER,
          [Betriebsausgaben]                            INTEGER,
          [Forschung und Entwicklung]                   INTEGER,
          [Vertriebs- und Verwaltungskosten]            INTEGER,
          [Personalkosten]                              INTEGER,
          [Abschreibung und Abgrenzungen]               INTEGER,
          [Sonstige Betriebskosten]                     INTEGER,
          [Geschäftsaufwand]                            INTEGER,
          [Betriebseinnahmen vor Zinsen und Steuern]    INTEGER,
          [Neutrale Erträge]                            INTEGER,
          [Gewinn vor Einkommenssteuer]                 INTEGER,
          [Steueraufwand]                               INTEGER,
          [Nettogewinn für weitere Geschäftstätigkeit]  INTEGER,
          [Nettogewinn]                                 INTEGER,
          [Nettogewinn verfügbar für Aktionäre]         INTEGER
      )
      ''')
      

      尽管如此,如上所述,请考虑使用下划线作为唯一符号的字母数字字符(不以数字开头)命名表/列标识符,并避免使用 DBMS 的关键字/保留字。这包括避免各种语言使用的重音字符。这样做,您就避免了任何上述转义的需要。

      cur.execute('''
      CREATE TABLE GuVY1 (
          id                                          INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT UNIQUE,
          Ertrag                                      INTEGER,
          Betriebskosten                              INTEGER,
          Bruttobetriebsgewinn                        INTEGER,
          Betriebsausgaben                            INTEGER,
          Forschung_und_Entwicklung                   INTEGER,
          Vertriebs_und_Verwaltungskosten             INTEGER,
          Personalkosten                              INTEGER,
          Abschreibung_und_Abgrenzungen               INTEGER,
          Sonstige_Betriebskosten                     INTEGER,
          Geschäftsaufwand                            INTEGER,
          Betriebseinnahmen_vor_Zinsen_und_Steuern    INTEGER,
          Neutrale_Ertrage                            INTEGER,
          Gewinn_vor_Einkommenssteuer                 INTEGER,
          Steueraufwand                               INTEGER,
          Nettogewinn_fur_weitere_Geschaftstatigkeit  INTEGER,
          Nettogewinn                                 INTEGER,
          Nettogewinn_verfugbar_fur_Aktionare         INTEGER
      )
      ''')
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-02-02
        • 2014-10-12
        • 2011-01-10
        • 1970-01-01
        • 2018-01-30
        相关资源
        最近更新 更多