[英]How do I alter two different column headers of a pre-existing database table in sqlalchemy?
我正在使用sqlalchemy将mysql数据库中表的列反映为python脚本。 这是我继承的数据库,该表的某些列标题在“染色体位置”中带有空格。 几个列标题也是以数字开头的字符串,例如“第一次”。 我想更改这些标题,以便用下划线替换空格,并且在列标题字符串的开头没有数字,例如“ 1st time”变为“ firsttime”。 我按照sqlalchemy的建议进行操作-用空格反映表和列 ,部分解决了我的问题。
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。 如何在同一反射事件中更改两个列名称功能?
似乎您在第二次替换后覆盖了第一个值。 我希望链接.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
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.