如何在Postgres + SQLalchemy中列名太久时引发异常?

时间:2017-08-24 14:51:36

标签: python postgresql sqlalchemy

我在python中有一个脚本,可以将文件上传到Postgres数据库服务器。然后将这些文件转换为SQL表。为此,我使用了SQLalchemy库。

当列名太长时会出现问题。我不希望Postgres在超过最大长度时自动截断列名称(如果我没记错的话,它在Postgres中是63)。这些表最终会出现名称难以理解的列,我宁愿让脚本取消上传。

显而易见的解决方案是"硬编码"在我的脚本中最大长度,如果有人试图上传一个表格太长而且只会引发异常#34;列名。尽管如此,我认为这应该可以在SQLalchemy中配置,例如,当表名已经在数据库中使用时,它会引发异常。

从我的脚本中提取上传表格:

from SQLalchemy import (
    create_engine,
)
import pandas as pd

DB_CONFIG_DICT = {
        'user': "user",
        'host': "urlforhost.com",
        'port': 5432,
        'password': "password"
}

DB_CONN_FORMAT = "postgresql+psycopg2://{user}:{password}@{host}:{port}/{database}"
DB_CONN_URI_DEFAULT = (DB_CONN_FORMAT.format( database='sandbox', **DB_CONFIG_DICT))
engine = create_engine(DB_CONN_URI_DEFAULT)
path = "file.csv"
table_name = "table_name"
df = pd.read_csv(path, decimal=r".")
df.columns = [c.lower() for c in df.columns] #postgres doesn't like capitals or spaces
df.to_sql(table_name, engine)

1 个答案:

答案 0 :(得分:0)

我希望这可以帮到你。

def check_column_name(name):
    if len(name) > 63:
        raise ValueError("column name (%s) is too long" % name)
df.columns = [c.lower() for c in df.columns]
map(check_column_name, df.columns)   # Check the column name before import
df.to_sql(table_name, engine)