繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM