SQLAlchemy选择where约束

时间:2014-08-29 22:46:30

标签: python mysql sql select sqlalchemy

我正试图从我的数据库中获取一个表的子集。该数据库是MySql数据库。

Python代码:

from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column, VARCHAR, DATETIME, INT, TEXT, TIMESTAMP
from datetime import datetime
from sqlalchemy.orm import sessionmaker

Base = declarative_base()
class TrackablesTable(Base):
        __tablename__ = 'Trackables'

        trackableId = Column(INT, primary_key=True) #autogenerate
        productID = Column(TEXT)
        createdOn = Column(TIMESTAMP) #autogenerate
        urlTitle = Column(TEXT)
        humanTitle = Column(TEXT)
        userId = Column(VARCHAR(45))


        def __repr__(self):
                return "<MyTable(%s)>" % (self.asin)

        @staticmethod
        def getTrackableByProductId(productID, session):
            trackable = session.query(TrackablesTable).filter_by(productID=productID)
            return trackable

请注意底部的方法。我期待这种方法能够获得&#34; Trackables&#34;中的所有行。带有&#34; productID&#34;的表格具有productID变量值的列。相反,它似乎返回一个格式错误的查询。

它返回的查询如下:

SELECT "Trackables"."trackableId" AS "Trackables_trackableId", "Trackables"."productID" AS "Trackables_productID", "Trackables"."createdOn" AS "Trackables_createdOn", "Trackables"."urlTitle" AS "Trackables_urlTitle", "Trackables"."humanTitle" AS "Trackables_humanTitle", "Trackables"."userId" AS "Trackables_userId" 
FROM "Trackables" 
WHERE "Trackables"."productID" = :productID_1

MySQL workbench告诉我查询格式错误。此外,productID查询中的值(&#34;:productID_1&#34;)不是代码中引用的变量的实际值。

1 个答案:

答案 0 :(得分:3)

您需要执行查询,而不仅仅是返回它。查询仍然是查询对象,直到在其上调用all()first()scalar()等方法,或者迭代它。

您的方法应如下所示:

@staticmethod
def getTrackableByProductId(productID, session):
    q = session.query(TrackableTable).filter_by(productID=productID)
    return q.first()

当您打印出查询时,SQLAlchemy会使用格式占位符而不是实际值显示查询。实际查询是由SQLAlchemy控件之外的dbapi(例如python-mysql)构建的。


旁注:您的代码(使用staticmethod和命名约定)看起来像是您尝试复制Java类。请考虑阅读PEP8