Python sql,将从第一个表获得的行值与第二个表的列名(不带循环)匹配
如果有人能解决以下问题,那对我真的很有帮助。我有两张桌子和一张桌子- 必需的SQL脚本:Python sql,将从第一个表获得的行值与第二个表的列名(不带循环)匹配,python,sql,performance,sqlite,Python,Sql,Performance,Sqlite,如果有人能解决以下问题,那对我真的很有帮助。我有两张桌子和一张桌子- 必需的SQL脚本: X1 15.2856 X10 18.2201 X14 13.3406 . . . . 在不使用循环的情况下,一个高效的SQL脚本将从第一个表获得的行值(sampleID)与第二个表的列名(X2、X4、X8…)匹配,并获得给定Gene_ID(例如NFYA)的值 预期结果: X1 15.2856 X10 18.2201 X14 13.3406 . . . . tableone(行X列:135 X 32)
X1 15.2856
X10 18.2201
X14 13.3406
. .
. .
在不使用循环的情况下,一个高效的SQL脚本将从第一个表获得的行值(sampleID)与第二个表的列名(X2、X4、X8…)匹配,并获得给定Gene_ID(例如NFYA)的值
预期结果:
X1 15.2856
X10 18.2201
X14 13.3406
. .
. .
tableone(行X列:135 X 32)
表说明(部分行和列)
表二(行X列:56000 X 137)
表说明(部分行和列)
用python编写的脚本,模块使用sqlite3
我正在添加完整的代码。如果你能在这里帮助我,那就太好了。提前谢谢
import os, sys, time
import sqlite3
import apsw
disk_db = apsw.Connection('sampleinfogenotype.db')
memcon=apsw.Connection(":memory:")
with memcon.backup("main",disk_db, "main") as backup:
backup.step() # copy whole database in one go
mdata=memcon.cursor()
for row in memcon.cursor().execute("SELECT tableone.SampleID from tableone WHERE tableone.Diagnos=='RH'"):
sampleID_row=str(row[0])
sqlscript="SELECT "+sampleID_row+ " FROM tabletwo WHERE tabletwo.Gene_ID=='NFYA'"
data=memdata.execute(sqlscript).fetchall()[0]
print sampleID_row,data[0]
memcon.close()
disk_db.close()
它给出了预期的结果,但它很耗时,因为有一个循环!是否有一个有效的sql脚本或方法…任何信息都会很有帮助..提前感谢您不需要反复重新查询第二个表,您只需检索一行并将其用作查找表即可。如果使用与检索一行一样简单的:
memcon.row_factory = sqlite3.Row
memdata.execute("select * from tabletwo where tabletwo.Gene_ID == 'NFYA'")
nfya_row = memdata.fetchone()
memdata.execute("SELECT tableone.SampleID from tableone WHERE tableone.Diagnos=='RH'")
for row in memdata:
sampleID = row['SampleID']
print sampleID, nfya_row[sampleID]
nfya_行
值现在保存一个sqlite3.row
对象,其键是列名。现在在tabelone
results上循环时,您可以直接查找任何给定列的值
如果您使用的是apsw
模块,则没有简单的现成行工厂返回字典,但您可以轻松地为一行构建字典:
memdata.execute("select * from tabletwo where tabletwo.Gene_ID == 'NFYA'")
nfya_row = {desc[0]: column for desc, column in zip(memdata.getdescription(), memdata.next())}
memdata.execute("SELECT tableone.SampleID from tableone WHERE tableone.Diagnos=='RH'")
for row in memdata:
sampleID = row[0]
print sampleID, nfya_row[sampleID]
>>感谢Martijn的快速回复…由于我使用apsw模块在内存中调用,我得到一个错误,如下memcon.row_factory=sqlite3.row AttributeError:'apsw.Connection'对象没有属性'row_factory',我已经编辑了我的问题并添加了完整的代码…如果您能在这里帮助我,那就太好了…提前谢谢@TJC:由于APSW以不同的方式处理行工厂,并且不像sqlite3那样包含一个方便的替代
行
类,我已经更新了我的答案,以包含一个APSW替代项。APSW仍然是一个问题…….AttributeError:'APSW.Cursor'对象没有属性'fetchone'。TJC:很抱歉;将fetchone()
替换为next()
。我自己从来没有使用过APSW。谢谢@Martijn Pieters。你救了我一天。我是sql的初学者。现在它工作正常了。我对代码“sampleID=row['sampleID']到sampleID=row[0]做了一个小的修改,因为元组索引必须是整数。
memdata.execute("select * from tabletwo where tabletwo.Gene_ID == 'NFYA'")
nfya_row = {desc[0]: column for desc, column in zip(memdata.getdescription(), memdata.next())}
memdata.execute("SELECT tableone.SampleID from tableone WHERE tableone.Diagnos=='RH'")
for row in memdata:
sampleID = row[0]
print sampleID, nfya_row[sampleID]