2017-02-15 2 views
2

Вот мой код:«Неправильный синтаксис» при добавлении столбца уу-мм-дд с ALTER TABLE

val = str(datetime.datetime.now().strftime("%y-%m-%d")) 
print(val) 

def export(): 
    cursor = conn.cursor() 
    cursor.execute("ALTER TABLE TRACKER ADD %s INTEGER" % val) 

    conn.commit() 

Когда я запускаю код, он печатает «17-02-14», но когда я ударил кнопка экспорта Я получаю сообщение об ошибке «Неправильный синтаксис рядом с« 17 »«

Синтаксис добавления столбца отлично работал с другими переменными. Он просто не работает с датой. Я даже давал дату как строку, но по какой-то причине это не исправило.

+0

Вы действительно хотите создать столбец с именем 17-02-14? Или имя столбца должно быть «timestamp» или что-то подобное? Ошибка состоит в том, что имена таблиц SQL не могут иметь дефисы с правильными escape-символами на месте (это вызывает проблемы, если вы в ней не нуждаетесь). – Sharad

+0

А, я этого не знал. Я хочу, чтобы название столбца было датой, поэтому я могу ссылаться на нее в будущем. Какой хороший способ сделать это? – user3364161

+0

Вы можете использовать символы подчеркивания вместо дефиса. Кроме того, используйте формат yyyymmdd для имени столбца. – Sharad

ответ

2

Вы пытались создать столбец с именем типа 17-02-15, но вы не были успешны, потому что нужно указывать имена столбцов, содержащие пробелы или «забавные символы». В следующем примере используется SQLite, который принимает стандартную двойную кавычку ANSI ("column name"), но другие СУБД могут использовать другие символы, например, MySQL имеет тенденцию использовать backquotes (`column name`), а Microsoft SQL Server обычно использует квадратные скобки ([column name]).

Код испытания:

import datetime 
import sqlite3 

conn = sqlite3.connect(':memory:') 
crsr = conn.cursor() 

sql = 'CREATE TABLE TRACKER (id INT PRIMARY KEY)' 
print(sql) 
crsr.execute(sql) 
conn.commit() 
print("Test table created.") 
print("") 

val = str(datetime.datetime.now().strftime("%y-%m-%d")) 

sql = 'ALTER TABLE TRACKER ADD %s INTEGER' % val 
print(sql) 
try: 
    crsr.execute(sql) 
    conn.commit() 
    print("Column added.") 
except Exception as ex: 
    print(repr(ex)) 
print("") 

# now try with quotes around the column name 
sql = 'ALTER TABLE TRACKER ADD "%s" INTEGER' % val 
print(sql) 
try: 
    crsr.execute(sql) 
    conn.commit() 
    print("Column added.") 
except Exception as ex: 
    print(repr(ex)) 
print("") 

sql = 'SELECT * FROM TRACKER' 
crsr.execute(sql) 
print("Current column names:") 
print([x[0] for x in crsr.description]) 

crsr.close() 
conn.close() 

Консоль вывода:

CREATE TABLE TRACKER (id INT PRIMARY KEY) 
Test table created. 

ALTER TABLE TRACKER ADD 17-02-15 INTEGER 
OperationalError('near "17": syntax error',) 

ALTER TABLE TRACKER ADD "17-02-15" INTEGER 
Column added. 

Current column names: 
['id', '17-02-15'] 

Следует также отметить, что различные СУБД могут иметь другие ограничения на имена столбцов, например, некоторые из них могут настаивать на том, что имя столбца не начать с цифровой цифрой.

+0

Отлично. Я пытался использовать '' и "", но никогда с квадратными скобками. Это прекрасно работает. – user3364161

Смежные вопросы