如何在python sqlalchemy中为select()创建公共模块?
我有3个来自SQLAlchemy的模型类用于我的表Table1 Table2 Table3 " " 我希望包装器连接能够处理所有3个具有不同列的不同表。基本上,使其尽可能通用化,以处理与通过SQLAlchemy ORM或核心库从表1中选择column相关的任何条件,其中column=value子句 我面临的问题就在这方面。 'q=query.filter\u bycolumn=value' 其中,我尝试从函数属性t1.name1传递列信息 ct.wrapper\u connectiont1,t1.name1,表1\u值\u信息 我面临的错误: 回溯最近一次呼叫上次: 文件C:\Users\AppData\Local\Programs\Python\37\lib\site packages\sqlalchemy\orm\base.py,第406行,在实体描述符中 返回getattrentity,键 AttributeError:类型对象“Table1”没有属性“column”如何在python sqlalchemy中为select()创建公共模块?,python,sql,flask,sqlalchemy,flask-sqlalchemy,Python,Sql,Flask,Sqlalchemy,Flask Sqlalchemy,我有3个来自SQLAlchemy的模型类用于我的表Table1 Table2 Table3 " " 我希望包装器连接能够处理所有3个具有不同列的不同表。基本上,使其尽可能通用化,以处理与通过SQLAlchemy ORM或核心库从表1中选择column相关的任何条件,其中column=value子句 我面临的问题就在这方面。 'q=query.filter\u bycolumn=value' 其中,我尝试从函数属性t1.name1传递列信息 ct.wrapper\u connectiont1,t1
问题中的代码需要三个更改: 在wrapper\u连接方法中,使用Query.filter而不是Query.filter\u by,因为它将直接接受列对象 在声明模型类之前,不要调用Base.metadata.create_all t1=Table1创建Table1类的一个新实例—一行。您希望查询表,因此直接使用模型类。
问题中的代码需要三个更改: 在wrapper\u连接方法中,使用Query.filter而不是Query.filter\u by,因为它将直接接受列对象 在声明模型类之前,不要调用Base.metadata.create_all t1=Table1创建Table1类的一个新实例—一行。您希望查询表,因此直接使用模型类。
非常感谢你,它成功了。在相同的上下文中讨论,这是否也适用于更新和删除包装器模块?目前,我必须为多个列提供多个函数,其中self.tablename.c.name是一个python对象,它总是在变化。”def delete_columnself,session,column_value:stmt=self.tablename.delete.whereself.tablename.c.name==column_value session.executestmt session.commit“通过反射数据库对象定义的表:'self.tablename=Tabletable,metadata,autoload=True,autoload_with=engine”非常感谢您的帮助。在相同的上下文中讨论,这是否也适用于更新和删除包装器模块?目前,我必须为多个列提供多个函数,其中self.tablename.c.name是一个python对象,它总是在变化。”def delete_columnself,session,column_value:stmt=self.tablename.delete.whereself.tablename.c.name==column_value session.executestmt session.commit“通过反射数据库对象定义的表:'self.tablename=Tabletable,metadata,autoload=True,autoload_with=engine”
from sqlalchemy import create_engine , text , select, MetaData, Table ,func , Column , String , Integer
from sqlalchemy.orm import sessionmaker
from sqlalchemy.ext.declarative import declarative_base
import sqlalchemy
from settings import DATABASE_URI
engine=create_engine(DATABASE_URI)
Base = declarative_base()
Base.metadata.create_all(engine)
Session = sessionmaker(bind=engine)
metadata = MetaData(bind=None)
session = Session()
class Table1(Base):
__tablename__ = 'table1'
id = Column(u'id', Integer(), primary_key=True)
name1 = Column(u'name1', String(50))
class Table2(Base):
__tablename__ = 'table2'
id = Column(u'id', Integer(), primary_key=True)
name2 = Column(u'name2', String(50))
class Table3(Base):
__tablename__ = 'table3'
id = Column(u'id', Integer(), primary_key=True)
name3 = Column(u'name3', String(50))
class connectionTest():
def wrapper_connection(self,table,column,value):
#SELECT column FROM table1 WHERE column = value
query = session.query(table)
q = query.filter_by(column = value)
session.execute(q)
def main():
ct = connectionTest()
t1 = Table1()
t2 = Table2()
t3 = Table3()
ct.wrapper_connection(t1,t1.name1, "Table1_Value_Information")
ct.wrapper_connection(t2,t2.name2, "Table2_Value_Information")
ct.wrapper_connection(t3,t3.name3, "Table3_Value_Information")
if __name__ == '__main__':
main()
class connectionTest:
def wrapper_connection(self, table, column, value):
# SELECT column FROM table1 WHERE column = value
query = session.query(table)
# We have the column object, so use filter
# instead of filter_by
q = query.filter(column == value)
session.execute(q)
# Create the tables after the model classes have been declared.
Base.metadata.create_all(engine)
Session = sessionmaker(bind=engine)
session = Session()
def main():
ct = connectionTest()
# Use the model classes directly.
ct.wrapper_connection(Table1, Table1.name1, "Table1_Value_Information")
ct.wrapper_connection(Table2, Table2.name2, "Table2_Value_Information")
ct.wrapper_connection(Table3, Table3.name3, "Table3_Value_Information")