0
votes

I am trying to create these tables and it gives me this error message: Traceback (most recent call last): File "D:/Programmieren/Python/PycharmProjects/untitled/Morningstar.py", line 128, in ''') sqlite3.OperationalError: near "-": syntax error

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
)
''')
3
Enclose the column names that have spaces or symbols like - in double quotes, or backticks or square barackets [...] - forpas
@Ufo367 . . . Fix your column names so they only use letters, numbers, and underscore. Do not give columns names that need to be escaped. That just clutters up queries and makes them harder to understand. - Gordon Linoff

3 Answers

0
votes

A hyphen is not a legal character in a sql column so it needs to be masked

0
votes
Vertriebs- und Verwaltungskosten            INTEGER,

You can't put a dash directly in the code. Instead, wrap each variable name in quotation marks (or remove the dash).

"Vertriebs- und Verwaltungskosten"            INTEGER,
0
votes

SQLite is perhaps the only well-used DBMS that supports multiple forms of escaping spaces, symbols/characters, and keywords:

Double Quotes (ANSI standard, used by 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
)
''')

Backticks (for MySQL/MariaDB compatibility)

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

Square Brackets (for SQL Server/MS Access compatibility)

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

Nonetheless as commented above, consider naming table/column identifiers with alphanumeric characters (not starting with a number) with underscore as only symbol and avoid keywords/reserved words of DBMS. This includes avoiding accented characters as used by various languages. Doing so, you avoid any need of above escaping.

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