2017-08-24 45 views
0

我有一个python脚本将文件上传到Postgres数据库服务器。这些文件然后被转换为SQL表。为此,我使用SQLalchemy库。如何在Postgres + SQLalchemy中的列名太长时引发异常?

问题出在列名太长时出现。我不希望Postgres在超过最大长度时自动截断列名(如果我正确记得,它在Postgres中是63)。表格最后有列名不明的名称,我只想让脚本取消上传。

显而易见的解决方案是在我的脚本中只是“硬编码”最大长度,如果有人试图上传带有“太长”列名的表,就引发异常。不过,我认为这应该可以在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) 

回答

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) 
+0

谢谢,但这正是我试图避免做的。 – Alechan