Python 使用Dataframe中的额外列在现有sql表中创建新列

Python 使用Dataframe中的额外列在现有sql表中创建新列,python,sqlite,sqlalchemy,Python,Sqlite,Sqlalchemy,我有几个数据帧,我希望将它们写入SQL数据库。但是,由于现有的SQL数据库可能没有pandas Dataframe中的特定列名,因此我收到一条错误消息,表示未找到表中的列,因此无法追加数据 # Example: df1 out= column1, column2, column3, column4 value1, value2, value3, value4 df2 out= columnA, columnB, columnC valueA, valueB,

我有几个
数据帧
,我希望将它们写入
SQL数据库
。但是,由于现有的
SQL数据库
可能没有
pandas Dataframe
中的特定
列名
,因此我收到一条错误消息,表示未找到表中的
列,因此无法追加数据

# Example:

df1 
out= column1, column2, column3, column4
     value1,  value2,  value3,  value4

df2
out= columnA, columnB, columnC
     valueA,  valueB,  valueC

# Initially I concat the df together and save it into SQL
combined_data = pandas.concat([df1, df2], axis=1,
                               join='inner')
pandas.DataFrame.to_sql(combined_data, name='table1', con=engine, 
                        if_exists='append', index=False)
但是,由于这个表已经创建,包含所有列,如果df2要有额外的列,我会收到一条错误消息

df2
out= columnA, columnB, columnC, columnD, columnE, columnF
     valueA,  valueB,  valueC,  valueD,  valueE,  valueF      
如何构造一个代码,在现有的
SQL表中创建新的列,这些列的名称作为
Dataframe
中缺少的列名

我想我可以用下面的
sqlcode

connection.execute("ALTER TABLE table1 ADD COLUMN new_column INTEGER DEFAULT 0")

但是如何确保添加的
新列
紧跟在df2中的列名之后?

我遇到了类似的问题,并采取了以下方法:

1) 从数据库表中获取列的列表。这可以通过多种方式实现,但我使用的是postgres而不是sqllite。有关从postgresql获取表的列名,请参见问题。这个问题似乎回答了如何为sqlite做到这一点

db_columns = list(engine.execute("SELECT column_name FROM information_schema.columns WHERE table_schema = 'public' AND table_name = 'my_table'")) 
这将返回元组列表,以便获取每个元组的第一个元组:

db_columns = [x[0] for x in db_columns]
您可以将表加载到pandas中,然后改用数据框的列。这显然需要更多的资源:

db_columns = pd.read_sql_query("SELECT * FROM my_table", connection).columns
2) 获取数据库表的列与df的列之间的差异。我喜欢使用集合,因为我觉得它们很直观。但是,它们不维护秩序:

new\u columns=set(df1.columns)-set(db\u columns)

如果订单很重要,则可以使用过滤器:

new_columns=list(过滤器(lambda x:x不在db_列中,df1.columns))

3) 迭代新列并准备将它们添加到表中:

query = ''   
query params = []
for column in new_columns:
query+= "ALTER TABLE %s ADD COLUMN %s %s;"  
query_params.extend(["my_table", column,"text"])
 result = connection.execute(query, query_params)
在本例中,我使用了“text”,但您可能希望将其替换为与pandas/numpy数据类型对应的基本数据类型
np.asscalar(value)
是将numpy类型转换为python类型的一种方法。有关将numpy转换为python类型的更多信息,请参见问题。 最后,将所有列添加到表中:

query = ''   
query params = []
for column in new_columns:
query+= "ALTER TABLE %s ADD COLUMN %s %s;"  
query_params.extend(["my_table", column,"text"])
 result = connection.execute(query, query_params)

我得到了这个错误:(1064,“您的SQL语法有错误;请查看与您的MySQL服务器版本对应的手册,以便在第1行的“my_table”添加列“col2”text”附近使用正确的语法)。听起来您有语法错误。我建议你仔细阅读你的代码,确保你有有效的语法(注意语法在不同的SQL变体之间可能会有所不同…我使用Postgresql是为了它的价值),如果你仍然有困难写你自己的问题。从你评论中有限的信息来看,很难提供任何额外的见解。