Dynami c создание таблиц SQLAlchemy ORM - PullRequest
0 голосов
/ 24 января 2020

Я новичок в SQLAlchemy ORM. Я пытаюсь создать программу приема AWS S3, которая будет принимать любой CSV-файл из корзины S3 в Postgres через ORM. Я пытаюсь прочитать первую строку файла CSV и сохранить результат в списке (columns_names). Код выдает ошибку:

не удалось собрать столбцы первичного ключа для сопоставленной таблицы.

Таблица создается в базе данных только после объявления столбца PRIMARY KEY. Является ли первичный ключ обязательным для создания таблицы через ORM? Также как мне динамически создавать столбцы из списка columns_names?

Вот мой код:

import boto
import boto3
import botocore
import os
from datetime import datetime
import s3fs
import pandas as pd 
import configparser
import re
from sqlalchemy import create_engine
from sqlalchemy import MetaData, Table, Column, Integer, String
from sqlalchemy.orm.session import sessionmaker
from sqlalchemy.orm import relationship
from sqlalchemy.ext.declarative import declarative_base


config = configparser.ConfigParser(allow_no_value=True)
config.read('IngestionConfig.config')
table_name = config.get('db-settings','table_name')
S3Bucket = config.get('AWS-settings','BucketName')
S3Key = config.get('AWS-settings','filename')
s3_client = boto3.client('s3')
response = s3_client.get_object(Bucket = S3Bucket, Key= S3Key)
file = response["Body"]
filedata = file.read() 
contents = filedata.decode('utf-8')
first_line = contents.split('\n',1)[0]
col_names = re.sub(r"\s+", '_', first_line).replace('"', r'')
columns_names= []
columns_names = col_names.split(',') 

postgresql_db = create_engine('postgresql://ayan.putatunda@localhost/postgres',echo = True)

Base = declarative_base()

class test(Base):
    __tablename__ = table_name
    for name in columns_names:
        name = Column(String)

Base.metadata.create_all(postgresql_db)

1 Ответ

0 голосов
/ 24 января 2020

SQLAlchemy ORM требует первичного ключа, потому что его дизайн требует способа идентифицировать строку, соответствующую объекту, поэтому невозможно использовать таблицу без первичного ключа в ORM.

Вы можете динамически создавать таблицы сначала создание словаря с информацией о вашей таблице:

col_lst = ['col_1', 'col_2', 'col_3']

attr_dict = {'__tablename__': 'myTableName'}
for col in col_lst:
    attr_dict[col] = Column(Integer)

Затем с помощью функции типа создайте таблицу Class с помощью метода declarative_base SQLAlchemy:

Base = declarative_base()

MyTableClass = type('MyTableClass', (Base,), attr_dict)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...