2017-08-24 6 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

関連する問題