如何在sqlalchemy中获取表对象和查询特定字段?

时间:2018-02-27 14:13:24

标签: sqlalchemy flask-sqlalchemy

当用户想要添加IP地址和端口以获取引用他添加的特定ip:port的url映射时,我创建了一个表。该表是根据他的电子邮件地址创建的。

def create_user_table(table_name):
    engine = get_sql_engine()
    metadata = MetaData(engine)
    user_table = Table(table_name, metadata,
        Column("userip_id", db.Integer, primary_key=True, autoincrement=True),
        Column("date_created", db.DateTime, default=db.func.current_timestamp()),
        Column("date_modified", db.DateTime, default=db.func.current_timestamp(),
                              onupdate=db.func.current_timestamp()),
        Column("ipaddress", CIDR, nullable=False),
        Column("urlmap", db.String(10), nullable=False, unique=True),
        Column("port", db.Integer, index=True),
        Column("device", db.String(10)),
        Column("path", db.String(30)),
        Column("service", db.String(10)),
        Column("count_updates", db.Integer, default=0, nullable=False),
        )
    user_table.create(engine)
    return user_table

我没有使ipaddress和端口地址唯一,因为同一个用户可以有不同的端口但是相同的ip和不同的ip但是相同的端口地址(我选择了以后考虑用户可以更新)

如果我在db继承表单db.Model中创建一个表,我可以查询 cls.query.filter(ipaddress=ipaddress).first()这将返回我的表对象,我可以检查是否有一个特定的端口,但现在我创建了继承自sqlalchemy.Table的表我没有查询功能可用。

如何查询和比较特定IP是否具有映射到现有urlmap的特定端口地址(未知)?

1 个答案:

答案 0 :(得分:0)

像往常一样想出来:p

# if same ip exists external port address should not exist in mapped in db.
query_table = helpers.get_query_result(user_table_name, "ipaddress", data['ip']).fetchall()
ports_mapped_to_ip_in_db = [item[5] for item in query_table]
if int(data['port']) in ports_mapped_to_ip_in_db:
    return jsonify({"status": "{}:{} is already registered.".format(data["ip"], data["port"])})

其中helpers模块中的get_query_result为:

def get_query_result(table_name, field_name=None, value=None):
    """ execute query and provide result
    """
    engine = get_sql_engine()
    if all([field_name, value]):
        return engine.execute("SELECT * FROM {} WHERE {}='{}'".format(table_name, field_name, value))
    else:
        return engine.execute("SELECT * FROM {}".format(table_name))