我在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)
答案 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)