Python 动态表创建SQLAlchemy ORM

Python 动态表创建SQLAlchemy ORM,python,postgresql,amazon-s3,sqlalchemy,Python,Postgresql,Amazon S3,Sqlalchemy,我不熟悉炼金术。我正在尝试构建一个AWS S3接收程序,该程序将通过ORM将任何CSV文件从S3 bucket接收到Postgres。我试图读取CSV文件的第一行,并将结果存储到列表(列名称)中。代码给出了一个错误: 无法为映射表组装任何主键列 只有在声明主键列之后,才能在数据库中创建该表。通过ORM创建表是否必须使用主键?另外,我如何从列表列\u名称动态创建列 这是我的密码: import boto import boto3 import botocore import os from dat

我不熟悉炼金术。我正在尝试构建一个AWS S3接收程序,该程序将通过ORM将任何CSV文件从S3 bucket接收到Postgres。我试图读取CSV文件的第一行,并将结果存储到列表(列名称)中。代码给出了一个错误:

无法为映射表组装任何主键列

只有在声明主键列之后,才能在数据库中创建该表。通过ORM创建表是否必须使用主键?另外,我如何从列表列\u名称动态创建列

这是我的密码:

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)


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)
接下来,使用type函数,使用SQLAlchemy的
声明性\u base
方法创建表类:

Base = declarative_base()

MyTableClass = type('MyTableClass', (Base,), attr_dict)

非常感谢。所以在我的例子中,我不知道表将有多少列。它取决于CSV文件。它可以是10列或50列。因此,我将列名复制到一个列表(列名称)。在上面给出的代码中,我将如何实现这一点?@AyanPutatunda我更新了我的答案,显示了如何从列表项创建字典键。uRock!非常感谢你!我必须为主键添加串行数据类型,但这正是我想要的方式。再次感谢attr_dict={'tablename':table_name,'uniqueid':Column(整数,primary_key=True)}对于Column_name中的col:attr_dict[col]=Column(字符串)`