Python sqlite3, создайте столбцы таблицы из списка с помощью .format - PullRequest
0 голосов
/ 25 февраля 2019

Я пытаюсь автоматически создать довольно большие таблицы базы данных sqlite, которые все имеют не менее 50 столбцов.Имена столбцов уже доступны в разных списках.Используя .format, я почти сделал это.Единственный открытый вопрос - это предопределение количества заполнителей для "{}" из длины списка имен.См. Пример кода ниже.

import sqlite3

db_path = "//Some path/"
sqlite_file = 'index_db.sqlite'

conn = sqlite3.connect(db_path + sqlite_file)
c = conn.cursor()

db_columns=['c1','c2','c3','c4','c5']

#This code is working
c.execute("create table my_table1 ({}, {}, {}, {}, {})" .format(*db_columns))
#This code doesn't work
c.execute("create table my_table2 (" + ("{}, " * 5)[:-2] + ")" .format(*db_columns))
#Following error appears
OperationalError: unrecognized token: "{"

#--> This even that the curly brackets are the same as in my_table1 
print("create table my_table2 (" + ("{}, " * 5)[:-2] + ")") 
#Output: create table my_table2 ({}, {}, {}, {}, {})

c.execute("INSERT INTO my_table1 VALUES (?,?,?,?,?)", (11, 111, 111, 1111, 11111))

conn.commit()
c.close
conn.close()

Есть ли способ решить эту проблему для my_table2?Или есть лучший способ динамически создавать имена столбцов из списка?

Ps Это внутренняя база данных, поэтому у меня нет проблем с безопасностью из-за динамического использования переменных в качестве имен.

Заранее спасибо!Тимур

1 Ответ

0 голосов
/ 25 февраля 2019

Отказ от ответственности :

не используйте конкатенацию строк для построения SQL-строк - см. Fe http://bobby -tables.com / python , чтобы узнать, как избежать внедренияиспользуя параметризованные запросы.


Согласно этому старому посту: Имя таблицы переменных в sqlite вы не можете использовать "нормальные" параметризованные запросы для создания имен таблиц / столбцов.

Вы можете предварительно отформатировать ваше состояние создания, хотя:

def scrub(table_name):
    # attributation: https://stackoverflow.com/a/3247553/7505395
    return ''.join( chr for chr in table_name if chr.isalnum() )

def createCreateStatement(tableName, columns):
    return f"create table {scrub(tableName)} ({columns[0]}" + (
            ",{} "*(len(columns)-1)).format(*map(scrub,columns[1:])) + ")"

tabName = "demo"
colNames = ["one", "two", "three", "dont do this"]

print(createCreateStatement(tabName, colNames))

Вывод:

create table demo (one,two ,three ,dontdothis )

Метод scrub взят из Ответ Дональда Майнера - проголосуй за него :) если тебе нравится

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...