我正在尝试从平面文件(csv)中读取SQLalchemy元数据,然后使用Python建立一个表。面临的挑战是将数据类型的列(以字符串形式读取)转换为SQLalchemy类型。
让我们从有效的代码开始:
column_names=['col1','col2','col3','col4']
column_types=[VARCHAR(255),Integer,Float,VARCHAR(255)]
pk_flags=[True,False,False,False]
null_flags=[True,True,True,True]
m=MetaData()
test=Table(tablename,m,
*(Column(cn,ct,primary_key=pk,nullable=nf)
for cn,ct,pk,nf in zip(column_names,column_types,pk_flags,null_flags)
)
)
con_str=database_driver+"://"+database_username+":"+database_password+"@"+data_server_name+"/"+database_name
engine=sqlalchemy.create_engine(con_str)
m.create_all(engine)
因此,我们创建4个列表来保存元数据,然后创建Table(),然后连接到数据库以创建表。这没问题。
我想做的就是对此进行修改,这样我就可以读取由上游进程生成或由用户单独创建的定界文件(csv)。考虑带有这些行/列的csv:
https://drive.google.com/open?id=1Vyo5VtG_TiPM47r6GklNHY2uWZNGhzTd
我尝试的代码:
#Read the csv
TableMetaData=pd.read_csv('C:/TableMetaData.csv')
print(TableMetaData)
print('')
#Pull column 1 into names
column_names=TableMetaData['column_names']
print(column_names)
print('')
#Pull column 2 into types
column_types=TableMetaData['column_types']
#column_types=[VARCHAR(255),Integer,Float,VARCHAR(255)]
print(column_types)
print('')
#Pull column 3 into flags
pk_flags=TableMetaData['pk_flags']
print(column_types)
print('')
#Pull column 4 into nullables
null_flags=TableMetaData['nullable_flags']
print(column_types)
print('')
#Build tables
m=MetaData()
test=Table(tablename,m,
*(Column(cn,ct,primary_key=pk,nullable=nf)
for cn,ct,pk,nf in zip(column_names,column_types,pk_flags,null_flags)
)
)
#Create tables
con_str=database_driver+"://"+database_username+":"+database_password+"@"+data_server_name+"/"+database_name
engine=sqlalchemy.create_engine(con_str)
m.create_all(engine)
此操作失败,并出现 AttributeError:'str'对象没有属性'_set_parent_with_dispatch'
该错误是由第一行引起的
column_types=TableMetaData['column_types']
#column_types=[VARCHAR(255),Integer,Float,VARCHAR(255)]
,但替换为第二行即可。要求是能够从文件中读取内容而不是对其进行硬编码(就像我在第二行,带注释的行中所做的那样)
是否可以将平面文件中的内容转换为SQLalchemy数据类型?
我想我可以写一个长度为IF的语句,但是希望有一些更优雅的方法。
谢谢