Python Pandas to sql, как создать таблицу с первичным ключом?

Я хотел бы создать таблицу MySQL с функцией To_sql Pandas, которая имеет первичный ключ( обычно хорошо иметь первичный ключ в таблице mysql), как так:

group_export.to_sql(con = db, name = config.table_group_export, if_exists = 'replace', flavor = 'mysql', index = False)

но это создает таблицу без первичного ключа (или даже без индекса).

в документации упоминается параметр "index_label", который в сочетании с параметром "index" может использоваться для создания индекса, но не упоминает никакой опции для первичного ключи.

документация

3 ответов


отказ от ответственности: этот ответ более экспериментальный, чем практический, но, возможно, стоит упомянуть.

я нашел, что класс pandas.io.sql.SQLTable назвал аргумент key и если вы присвоите ему имя поля, то это поле будет первичным ключом:

к сожалению вы не можете просто перенести этот аргумент от


просто добавьте первичный ключ после загрузки таблицы с панд.

group_export.to_sql(con=engine, name=example_table, if_exists='replace', 
                    flavor='mysql', index=False)

with engine.connect() as con:
    con.execute('ALTER TABLE `example_table` ADD PRIMARY KEY (`ID_column`);')

automap_base С sqlalchemy.ext.automap (tableNamesDict-это дикт только с таблицами панд):

metadata = MetaData()
metadata.reflect(db.engine, only=tableNamesDict.values())
Base = automap_base(metadata=metadata)
Base.prepare()

который работал бы отлично, за исключением одной проблемы,automap требует, чтобы таблицы имели первичный ключ. Хорошо, нет проблем, я уверен, панды to_sql имеет способ указать первичный ключ... нет. Вот где он становится немного hacky:

for df in dfs.keys():
    cols = dfs[df].columns
    cols = [str(col) for col in cols if 'id' in col.lower()]
    schema = pd.io.sql.get_schema(dfs[df],df, con=db.engine, keys=cols)
    db.engine.execute('DROP TABLE ' + df + ';')
    db.engine.execute(schema)
    dfs[df].to_sql(df,con=db.engine, index=False, if_exists='append')

я повторяю через dict of DataFrames, получить список столбцов для первичного ключа (т. е. содержащие id), используйте get_schema чтобы создать пустые таблицы, добавьте DataFrame к столу.

теперь, когда у вас есть модели, вы можете явно назвать и использовать их (т. е. User = Base.classes.user) С session.query или создать дикт всех классов что-то вроде этого:

alchemyClassDict = {}
for t in Base.classes.keys():
    alchemyClassDict[t] = Base.classes[t]

и запрос:

res = db.session.query(alchemyClassDict['user']).first()