Python 如何更改sqlalchemy中预先存在的数据库表的两个不同列标题?

Python 如何更改sqlalchemy中预先存在的数据库表的两个不同列标题?,python,mysql,sqlalchemy,Python,Mysql,Sqlalchemy,我使用sqlalchemy将mysql数据库中表的列反映到python脚本中。这是我继承的数据库,表的一些列标题在例如“染色体位置”中有空格。两个列标题也是以数字开头的字符串,例如“第一次”。 我想更改这些标题,以便用下划线替换空格,并且列标题字符串的开头没有数字,例如“1st time”变为“firsttime”。我听从了别人的建议,部分解决了我的问题 from sqlalchemy import create_engine, Column, event, MetaData from sql

我使用sqlalchemy将mysql数据库中表的列反映到python脚本中。这是我继承的数据库,表的一些列标题在例如“染色体位置”中有空格。两个列标题也是以数字开头的字符串,例如“第一次”。 我想更改这些标题,以便用下划线替换空格,并且列标题字符串的开头没有数字,例如“1st time”变为“firsttime”。我听从了别人的建议,部分解决了我的问题

from sqlalchemy import create_engine, Column, event, MetaData 
from sqlalchemy.ext.declarative import declarative_base, DeferredReflection
from sqlalchemy.orm import sessionmaker, Session
from sqlalchemy.ext.automap import automap_base
from sqlalchemy.schema import Table
from twisted.python import reflect

Base = automap_base()
engine = create_engine('mysql://username:password@localhost/variants_database', echo=False)

#Using a reflection event to access the column attributes
@event.listens_for(Table, "column_reflect")
def reflect_col(inspector, table, column_info):
     column_info['key'] = column_info['name'].replace(' ', '_')

metadata = MetaData()
session = Session(engine)

class Variants(Base):
    __table__ = Table("variants", Base.metadata, autoload=True,      autoload_with=engine)

Base.prepare(engine, reflect=True)   
session = Session(engine)


a = session.query(Variants).filter(Variants.Gene == "AGL").first()
print a.Chromosome_Position
这允许我返回a.u位置的值。同样,如果我将方法reflect_col更改为:

@event.listens_for(Table, "column_reflect")
def reflect_col(inspector, table, column_info):
     column_info['key'] = column_info['name'].replace('1st time', 'firsttime')

a = session.query(Variants).filter(Variants.Gene == "AGL").first()
print a.firsttime
这也允许我第一次返回值。但是,我无法同时更改列标题的两个属性,因此将方法更改为:

@event.listens_for(Table, "column_reflect")
def reflect_col(inspector, table, column_info):
column_info['key'] = column_info['name'].replace(' ', '_')
column_info['key'] = column_info['name'].replace('1st time', 'secondcheck')

将只修改对列_info的最后一次调用,在本例中,该列为“第一次”。所以我可以返回a.firsttime的值,但不能返回a.u位置。如何在同一个反射事件中更改两个列名功能?

第二次替换后,您似乎正在覆盖第一个值。我希望链接
.replace
能起作用:

@event.listens_for(Table, "column_reflect")
def reflect_col(inspector, table, column_info):
   column_info['key'] = column_info['name'].replace(' ', '_').replace('1st_time', 'secondcheck')
[编辑]:您还必须确保更改不会冲突


因为在本例中,第一个更改将空格替换为下划线,所以您必须调整第二个替换,因为在调用第二个替换时,它已经被称为
1st\u time

第二个替换之后,您似乎正在覆盖第一个值。我希望链接
.replace
能起作用:

@event.listens_for(Table, "column_reflect")
def reflect_col(inspector, table, column_info):
   column_info['key'] = column_info['name'].replace(' ', '_').replace('1st_time', 'secondcheck')
[编辑]:您还必须确保更改不会冲突


因为在本例中,第一个更改将空格替换为下划线,所以您必须调整第二个替换,因为在调用第二个替换时,它已经被称为
1st\u time

谢谢您,它工作得很好。我需要做的唯一编辑是,我需要记住在第二次替换中更改要替换的字符串,以考虑到已从第一次.replace添加了下划线。所以第二个.replace应该是.replace('1st_time','secondcheck')。@user1977981是的,我刚刚添加了关于这个的注释……)谢谢你,工作做得很好。我需要做的唯一编辑是,我需要记住在第二次替换中更改要替换的字符串,以考虑到已从第一次.replace添加了下划线。所以第二个.replace应该是.replace('1st_time','secondcheck')。@user1977981是的,我刚刚添加了关于这个的注释……)