Python sqlalchemy:没有主键和重复值的表?

Ein*_*nar 5 python sqlalchemy

我正在使用第三方用sqlalchemy制作的现有数据库.但是,我遇到了麻烦,因为表没有primar密钥,更糟糕的是,它们每行都有重复的元素,所以我不能选择现有的列作为主键.这些表有两列:两列都有非唯一值.

我试图按照http://www.blog.pythonlibrary.org/2010/09/10/sqlalchemy-connecting-to-pre-existing-databases/对表进行修补,但显然这不起作用(见下文)

我当前的代码是(MirnaTable是我的映射类,基本上只是一个没有别的骨架)

connection = create_engine("sqlite:///targets.sqlite")
metadata = MetaData(bind=connection)
db_table = Table("miranda", metadata,
                 Column("id", Integer, primary_key=True),
                 autoload=True)
mapper(MirnaTable, db_table)
Session = sessionmaker(connection)
session = Session()
Run Code Online (Sandbox Code Playgroud)

然后我尝试例如发行

all_records = session.query(MirnaTable).all()
Run Code Online (Sandbox Code Playgroud)

我明白了

sqlalchemy.exc.OperationalError: (OperationalError) no such column: miranda.id 
u'SELECT miranda.gene_id AS miranda_gene_id, miranda."mature_miRNA" AS
"miranda_mature_miRNA", miranda.id AS miranda_id \nFROM miranda' ()
Run Code Online (Sandbox Code Playgroud)

所以当然找不到id列.关于我做错了什么的任何想法?提前致谢.

编辑:根据要求,这是一个表中的示例(直接从sqlite检索):

gene  mature_miRNA 
---- -------------
80205  hsa-miR-200c 
80205  hsa-miR-200c 
9693  hsa-miR-200c 
9693  hsa-miR-200c 
9881  hsa-miR-200c 
9710  hsa-miR-200c 
9750  hsa-miR-200c 
Run Code Online (Sandbox Code Playgroud)

Den*_*ach 6

你误解了你所指的帖子.您必须选择现有列并将其定义为主列.也可以通过将它们全部放在定义中来设置复合主键.在你的情况下,我认为一个基因有几个成熟的microRNA,所以主键可能应该是(gene_id, mature_miRNA)对.由于表中没有更多字段,因此不需要autoload=True标记.

db_table = Table("miranda", metadata,
                 Column("gene_id", Integer, primary_key=True),
                 Column("mature_miRNA", Integer, primary_key=True))
Run Code Online (Sandbox Code Playgroud)

我不知道表中字段的类型,因此如果它们不是整数,则适当地更改它们.