当前位置: 首页 > 面试题库 >

Python Pandas to_sql,如何用主键创建表?

魏学智
2023-03-14
问题内容

我想用Pandas的to_sql函数创建一个具有主键的MySQL表(在mysql表中具有主键通常是一种好习惯),如下所示:

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

但这会创建一个没有任何主键(甚至没有任何索引)的表。

该文档提到了参数“ index_label”,该参数与“ index”参数结合可用于创建索引,但未提及主键的任何选项。

文献资料


问题答案:

免责声明:这个答案是实验性的,而不是实用的,但也许值得一提。

我发现该类pandas.io.sql.SQLTable已命名为参数key,如果您为其分配了字段名称,则该字段将成为主键:

不幸的是,您不能只从DataFrame.to_sql()函数传递此参数。要使用它,您应该:

  1. 创建pandas.io.SQLDatabase实例

    engine = sa.create_engine('postgresql:///somedb')
    

    pandas_sql = pd.io.sql.pandasSQL_builder(engine, schema=None, flavor=None)

  2. 定义函数类似于pandas.io.SQLDatabase.to_sql()但带有附加*kwargs参数的函数,该函数传递给pandas.io.SQLTable在内部创建的对象(我刚刚复制了原始to_sql()方法并添加了*kwargs):

    def to_sql_k(self, frame, name, if_exists='fail', index=True,
           index_label=None, schema=None, chunksize=None, dtype=None, **kwargs):
    if dtype is not None:
        from sqlalchemy.types import to_instance, TypeEngine
        for col, my_type in dtype.items():
            if not isinstance(to_instance(my_type), TypeEngine):
                raise ValueError('The type of %s is not a SQLAlchemy '
                                 'type ' % col)
    
    table = pd.io.sql.SQLTable(name, self, frame=frame, index=index,
                     if_exists=if_exists, index_label=index_label,
                     schema=schema, dtype=dtype, **kwargs)
    table.create()
    table.insert(chunksize)
    
  3. 使用SQLDatabase实例和要保存的数据框调用此函数

    to_sql_k(pandas_sql, df2save, 'tmp',
        index=True, index_label='id', keys='id', if_exists='replace')
    

我们得到类似

CREATE TABLE public.tmp
(
  id bigint NOT NULL DEFAULT nextval('tmp_id_seq'::regclass),
...
)

在数据库中。

PS当然,您可以安装monkey-patch DataFrameio.SQLDatabaseio.to_sql()可以方便地使用此替代方法。



 类似资料:
  • 你不知道如何在JOOQ(Java)中创建主键吗?我需要的只是得到正确的创建表字符串。我还没有这段代码(使用SQLDialect。MYSQL): 输出(来自字符串生成器): 我需要的是设置主键以获得正确的输出: 不使用execute()是否可能?因为我只需要它作为字符串,所以我想再次使用only getSQL()命令。。。 我发现了类似这样的东西:DSL。主密钥(“id”); 但我无法将它与rest

  • 问题内容: 我已经使用下面给出的建议更新了代码,该建议已经过测试并且效果很好,可以为将来的用户提供快速参考。 我使用下面的代码来创建链接表,而不必为每个用户设置DSN,我如何指定主键,因为系统会询问您是否手动连接: 注意:上面是针对SQL Server VIEW的,对于SQL Server TABLE而言是相同的,但是您不需要该行(如果在服务器上正确设置了主键)。 该代码代替了链接表并手动指定主键

  • 问题内容: 这是我正在使用的密集设置的过度简化。并且都具有自动增量代理主键作为ID。是包含有关和的信息的表。 我试图决定,如果我应该做的主键的复合ID的距离和。如果我要这样做,哪一个最有意义? (在此示例中,我将ID 11209与ID 437组合在一起) 11209437 (我可以想象为什么这很糟糕) 11209-437 11209.437 或者是其他东西? 将其用作MYSQL MYISAM DB

  • jOOQ具有文档中所述的CREATE TABLE语法: 我想知道如何定义哪个列属于主键?那么,在jOOQ中有没有办法用主键信息创建create TABLE语句呢? 我对SQLite的解决方案特别感兴趣,它没有语法来添加主键,所以我认为在最坏的情况下,我必须去一个特定于数据库的解决方案?

  • 我试图在Cassandra CLI版本1.1.6中创建一个列族,我不确定如何将主键指定为MovieID。

  • 问题内容: 我在Postgres DB中有两个名为&的表,如下所示: 如何确保仅将或的唯一组合用于主键,以便表不允许插入以下内容: 如果已经有包含like的行: 目的是避免相同玩家之间的比赛进入。 问题答案: 创建一个唯一索引: 不能是或约束,因为它们仅适用于列,不适用于表达式。 您可以添加一个列作为PK,但是只有两个整数列,原始PK也非常有效(请参阅注释)。它会自动使两列都变为。(否则,添加约束