Я работаю с базой данных в SQLite и импортирую кучу файлов csv в свою базу данных. К сожалению, насколько я могу судить, нет возможности добавить первичный ключ во время импорта, поэтому я использую обходной путь, в котором я читаю файл csv и использую to_sql от Pandas, а затем executescript:
df = pd.read_csv('filepath.csv', header = 0, index_col = False, encoding = 'UTF-8')
df.to_sql(name = 'table1', con = conn, if_exists='replace', index=False)
c.executescript('''
PRAGMA foreign_keys=off;
BEGIN TRANSACTION;
ALTER TABLE table1 RENAME TO table1_alt;
/*create a new table with the same column names and types while
defining a primary key for the desired column*/
CREATE TABLE Ass_info_table (column1 INT,
column2 TEXT,
column3 INT,
column4 INT,
column5 INT,
column6 TEXT,
column7 TEXT,
column8 TEXT,
column9 TEXT,
column10 TEXT,
column11 TEXT,
column12 INT,
column13 INT,
ID INT PRIMARY KEY NOT NULL);
INSERT INTO table1 SELECT * FROM table1_alt;
DROP TABLE table1_alt;
COMMIT TRANSACTION;
PRAGMA foreign_keys=on;''')
Это работает отлично, но у меня есть куча файлов csv, которые я хотел передать на glob и импортировать их все в цикле. Моя проблема в том, что для этого мне нужно найти способ получить имена таблиц и столбцов в этом сценарии SQL в функции. Эта функция может выполняться при импорте таблицы в базу данных или после нее, это не имеет особого значения.
Всем, у кого есть предложения, мы будем рады!
вы используете pd.to_sql и скрипт отдельно?
mad_ Я использую их отдельно, так как простой импорт csv в базу данных дает мне таблицу без первичного ключа. Парфе, если я это сделаю, то у меня будет таблица с уже назначенным первичным ключом, верно? Чего я не хочу.
Как и любые автоинкременты базы данных (или последовательности, если используется Oracle и идентификация в SQL Server), первичный ключ будет автоматически увеличиваться с каждой новой записью. Досрочно ничего не назначается.
К сожалению, файлы csv уже имеют встроенный уникальный идентификатор, который мне нужно использовать в качестве первичного ключа (для реляционных целей), поэтому я должен использовать то, что уже есть, и назначить первичный ключ одному из существующих столбцов.






Если вы можете анализировать имя таблицы и имена столбцов из CSV или других источников, вы можете сделать запрос, прежде чем передавать его в функцию выполнения.
Пример:
table_name = "P_data"
query_template = "SELECT * FROM {0}"
final_query=query_template.format(table_name)
а затем вы можете передать final_query в выполнение. Мне нравится делать окончательный запрос с помощью шаблонов, но вы можете сделать это напрямую.
query_template = "SELECT * FROM {0}".format(table_name)"
Надеюсь, это поможет тебе.
Почему бы не использовать командную строку SQLite для импорта CSV-файлов в текущие пустые таблицы с целочисленным первичным ключом, поскольку согласно часто задаваемым вопросам SQLite: Столбец, объявленный INTEGER PRIMARY KEY, будет автоматически увеличиваться?