Niestety nie ma sposobu, aby ustawić teraz klucz podstawowy w metodzie pandas df.to_sql(). Dodatkowo, aby sprawić, by było więcej bólu, nie można ustawić klucza podstawowego w kolumnie w sqlite po utworzeniu tabeli.
Jednak obecnie praca polega na utworzeniu tabeli w sqlite za pomocą metody pandas df.to_sql(). Następnie możesz utworzyć zduplikowaną tabelę i ustawić klucz podstawowy, a następnie skopiować dane. Następnie upuść stary stół, aby posprzątać.
To byłoby coś na kształt tego.
import pandas as pd
import sqlite3
df = pd.read_csv("/Users/data/" +filename)
columns = df.columns columns = [i.replace(' ', '_') for i in columns]
#write the pandas dataframe to a sqlite table
df.columns = columns
df.to_sql(name,con,flavor='sqlite',schema=None,if_exists='replace',index=True,index_label=None, chunksize=None, dtype=None)
#connect to the database
conn = sqlite3.connect('database')
c = conn.curser()
c.executescript('''
PRAGMA foreign_keys=off;
BEGIN TRANSACTION;
ALTER TABLE table RENAME TO old_table;
/*create a new table with the same column names and types while
defining a primary key for the desired column*/
CREATE TABLE new_table (col_1 TEXT PRIMARY KEY NOT NULL,
col_2 TEXT);
INSERT INTO new_table SELECT * FROM old_table;
DROP TABLE old_table;
COMMIT TRANSACTION;
PRAGMA foreign_keys=on;''')
#close out the connection
c.close()
conn.close()
W przeszłości zrobiłem to, ponieważ stanąłem przed tym problemem. Po prostu zapakowałem całość, aby było wygodniejsze ...
W moim ograniczonym doświadczeniu z sqlite stwierdziłem, że nie mogę dodać klucza podstawowego po utworzeniu tabeli, co uniemożliwiło wykonanie Zaktualizuj wstawki lub UPSERTS, a UPDATE JOIN spowodowało wiele frustracji i niekonwencjonalnych obejść.
Wreszcie, w metodzie pandas df.to_sql() znajduje się argument słowa kluczowego dtype, który może przyjmować słownik nazw kolumn: typy. IE: dtype = {col_1: TEXT}