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

时间:2015-07-10 09:16:58

标签: python mysql sqlalchemy

我使用sqlalchemy将mysql数据库中的表的列反映到python脚本中。这是我继承的数据库,该表的一些列标题在例如"染色体位置"中有空格。一些列标题也是以数字开头的字符串,例如"第一次"。 我想改变这些标题,以便用下划线替换空格,并且在列标题字符串的开头没有数字,例如"第一次"变成" firsttime"。我按照sqlalchemy - reflecting tables and columns with spaces给出的建议部分解决了我的问题。

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.Chromosome_Position中的值。同样,如果我将方法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

这也允许我在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')

只会修改对column_info的最后一次调用,在这种情况下,该列是第一次'列。所以我可以返回a.firsttime但不是a.Chromosome_Position的值。如何在同一个反射事件中更改两个列名称功能?

1 个答案:

答案 0 :(得分:0)

在第二次更换后,您似乎覆盖了第一个值。我希望链接.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_time