我有一个pandas dataframe如下:
In [93]: df = pd.DataFrame([[1, 'a'], [2, 'b'], [3, 'a']], columns=['val', 'types'])
In [94]: df
Out[94]:
val types
0 1 a
1 2 b
2 3 a
In [95]: df.dtypes
Out[95]:
val int64
types object
dtype: object
# convert the 'types' column to category
In [96]: df.types = pd.Categorical(df.types)
字符串
假设我已经有一个postgres表,列types
为 ENUM,我如何使用pandas to_sql
方法通过sqlachemy类型将数据插入到我的DB中?
我试过这个,但无法让它工作:
In [101]: class myEnum(enum.Enum):
...: a = 1
...: b = 2
...:
In [102]: from sqlalchemy.types import *
In [103]: sql_dtypes = {'val' : SmallInteger(), 'types': Enum(myEnum)}
In [104]: df.to_sql('tablename', conn, if_exists='replace', index=False,
dtype=sql_dtypes)
型
运行时会出现以下错误:
sqlalchemy.exc.ProgrammingError: (psycopg2.ProgrammingError) type "myEnum" already
exists
[SQL: "CREATE TYPE myEnum AS ENUM ('a', 'b')"] (Background on this
error at: http://sqlalche.me/e/f405)
型
使用pd.io.json.build_table_schema
中的schema
选项进行指定也没有帮助。
2条答案
按热度按时间puruo6ea1#
要在
pandas.to_sql
中处理postgresql enum,我们应该执行以下操作:试图用一个相关的例子来解释,以便更容易阅读。
在pandas之外的数据库DDL中。所以Postgresql Enum是在pandas作用域之外创建的。
字符串
用Pandas文字
型
几点建议:
ENUM
来自sqlalchemy.dialects.postgresql
,而不是python的Enumsql_dtypes
仅定义列的子集,而不是所有列类型。这应该有助于保存手动工作to_sql
中-dtype=sql_dtypes
被分配了字典Map到sqlalchemy枚举类型BankTransactionType
创建中,我们提到-create_type=False
以跳过这种类型的创建。这在pandas.to_sql
之外进行处理希望这对某人有帮助。
mwecs4sa2#
我现在从here找到的一个解决方法是首先将数据类型写为
varchar
,然后将其转换为enum
。字符串
但我希望有更好的解决办法。