Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.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 通过主键将列表作为参数传递,从任意表加载记录_Python_Python 2.7_Sqlalchemy - Fatal编程技术网

Python 通过主键将列表作为参数传递,从任意表加载记录

Python 通过主键将列表作为参数传递,从任意表加载记录,python,python-2.7,sqlalchemy,Python,Python 2.7,Sqlalchemy,我使用的SQLAlchemy核心功能没有ORM,我需要通过主键将列表作为参数传递来从任意表加载记录 目前我的做法是: records = select([arbitrary_table], list(arbitrary_table.primary_key.columns._all_cols)[0].in_([1, 2, 3])) 任意_表作为参数传递,它可以是主键为整数而非复合的任何表,但主键可以有不同的名称 我对此有几个问题: Q1: 有没有办法优化它? 我非常确定list(self.arb

我使用的SQLAlchemy核心功能没有ORM,我需要通过主键将列表作为参数传递来从任意表加载记录

目前我的做法是:

records = select([arbitrary_table], list(arbitrary_table.primary_key.columns._all_cols)[0].in_([1, 2, 3]))
任意_表
作为参数传递,它可以是主键为整数而非复合的任何表,但主键可以有不同的名称

我对此有几个问题:

Q1: 有没有办法优化它? 我非常确定
list(self.arbitral\u table.primary\u key.columns.\u all\u cols)[0]
不是获取主键列的最佳方式

Q2: 如何对ORM查询执行相同的操作? SA站点的示例具有
my_user=session.query(user).get(5)
,但它只接受一个ID作为参数,并且没有覆盖以获取ID列表

我将非常感谢您的建议。

primary\u key属性是
PrimaryKeyConstraint
的一个实例,它在适当的位置是可移植的,因此
list(table.primary\u key)[0]
就是您在该列中所需的全部内容

下面的示例演示了两种复合兼容技术(编辑:哦,你说的是“非复合”。无论如何,这是很酷的代码……使用select_by_single_pk()),一种需要元组支持(postgresql,可能是mysql),另一种需要字符串输出和/或,以及单个pk方法。然后显示接受元组的query.get()

from sqlalchemy import tuple_, or_, and_

def select_by_composite_pk(table, values):
    "works only in a high-capability database like postgresql"
    return table.select().where(tuple_(*table.primary_key).in_(values))

def select_by_composite_pk_no_tuples(table, values):
    "works in any database"

    return table.select().where(
            or_(
                *[
                    and_(*[col == val for col, val in zip(table.primary_key, val)])
                    for val in values
                ]
            ))

def select_by_single_pk(table, values):
    "works in any database"
    return table.select().where(list(table.primary_key)[0].in_(values))

if __name__ == '__main__':
    from sqlalchemy import create_engine, Table, Column, Integer, MetaData

    eng = create_engine("postgresql://scott:tiger@localhost/test", echo=True)

    conn = eng.connect()
    trans = conn.begin()

    m = MetaData()

    # single PK column
    a = Table('a', m, Column('x', Integer, primary_key=True),
                            Column('y', Integer))

    # composite PK column
    b = Table('b', m, Column('x', Integer, primary_key=True),
                    Column('y', Integer, primary_key=True))

    m.create_all(conn)

    conn.execute(a.insert(), [
            {'x': i, 'y': i * 2} for i in xrange(10)
        ])
    conn.execute(b.insert(), [
            {'x': i, 'y': i * 2} for i in xrange(10)
        ])

    print conn.execute(
                select_by_composite_pk(a,
                    [tuple_(3, ), tuple_(5, ), tuple_(9, )])).fetchall()

    print conn.execute(
                select_by_composite_pk(b,
                    [tuple_(3, 6), tuple_(5, 10), tuple_(9, 18)])).fetchall()

    print conn.execute(
                select_by_composite_pk_no_tuples(b,
                    [(3, 6), (5, 10), (9, 18)])).fetchall()

    print conn.execute(
                select_by_single_pk(b, [3, 5, 9])).fetchall()

    # ORM query version
    from sqlalchemy.orm import Session
    from sqlalchemy.ext.declarative import declarative_base

    Base = declarative_base()

    class MyCompositeClass(Base):
        __table__ = b

    # get accepts a tuple
    print Session(conn).query(MyCompositeClass).get((5, 10))

伟大的因此,我只需要将代码中的
列表(任意表.主键.列.\u所有列)[0]
替换为
列表(任意表.主键)[0]