Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/317.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python sql,将从第一个表获得的行值与第二个表的列名(不带循环)匹配_Python_Sql_Performance_Sqlite - Fatal编程技术网

Python 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)

如果有人能解决以下问题,那对我真的很有帮助。我有两张桌子和一张桌子-

必需的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)

表说明(部分行和列)

表二(行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]