Синтаксическая ошибка MySQL при использовании Python для добавления столбца в таблицу - PullRequest
0 голосов
/ 27 октября 2010

Код, который у меня есть:

for key in keys:
    cursor.execute("""
                    ALTER TABLE segment_table ADD %s VARCHAR(40)
                    """, key)

Я получаю ошибку, сообщающую, что мой синтаксис неверенКогда я заменяю% s фактической строкой, синтаксическая ошибка исчезает.

for key in keys:
    cursor.execute("""
                    ALTER TABLE segment_table ADD myColumn VARCHAR(40)
                    """)

Любая помощь приветствуется.

Ответы [ 3 ]

5 голосов
/ 28 октября 2010

Здесь происходит некоторая путаница по нескольким причинам:

(1) mySQL использует % в качестве маркера параметра - его легко спутать с % в Python string % (data1, data2, etc)

(2) некоторые люди, похоже, не знают, что маркеры параметров можно использовать только тогда, когда в синтаксисе SQL можно использовать выражение - это исключает имена таблиц, имена столбцов, имена функций, ключевые слова и т.д.

(3) Code-Golf onelinerism

Обязательный SQL: ALTER TABLE segment_table ADD myColumn VARCHAR(40)

Использование параметра не работает:

key = "myColumn"
sql = "ALTER TABLE segment_table ADD %s VARCHAR(40)" # col name not OK as parm
cursor.execute(sql, (key, ))

Вам необходимо создать приемлемый оператор SQL, используя, например, Форматирование строки Python:

key = "myColumn"
sql = "ALTER TABLE segment_table ADD %s VARCHAR(40)" % key
cursor.execute(sql)
3 голосов
/ 27 октября 2010

Разве вы не должны сделать замену перед кормлением?

query = "ALTER TABLE segment_table ADD %s VARCHAR(40)" % (key)
cursor.execute( query )
2 голосов
/ 27 октября 2010

когда cursor.execute () заменяет% s в строке запроса, он добавляет '' к предоставленным значениям аргумента ... поэтому, когда вы делаете

key = 'abc'
cursor.execute("""
                ALTER TABLE segment_table ADD %s VARCHAR(40)
                """, key)

выполнено запроса

ALTER TABLE segment_table ADD 'abc' VARCHAR(40)

, в который mysql сгенерирует синтаксическую ошибку, поскольку имена столбцов, имена таблиц могут быть в ``, но не ''

так что это будет работать

query = "ALTER TABLE segment_table ADD %s VARCHAR(40)" % (key)
...