我使用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的值。如何在同一个反射事件中更改两个列名称功能?
答案 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
。