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()