簡體   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