Python 动态表创建SQLAlchemy ORM
我不熟悉炼金术。我正在尝试构建一个AWS S3接收程序,该程序将通过ORM将任何CSV文件从S3 bucket接收到Postgres。我试图读取CSV文件的第一行,并将结果存储到列表(列名称)中。代码给出了一个错误: 无法为映射表组装任何主键列 只有在声明主键列之后,才能在数据库中创建该表。通过ORM创建表是否必须使用主键?另外,我如何从列表列\u名称动态创建列 这是我的密码: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
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(字符串)`