标签: flask-sqlalchemy

计算 sql-alchemy 中的唯一行数

我是 sql alchemy 的新手,我想计算表中的唯一行,并输出唯一行以及该行的副本数。假设我有一张这样的桌子

Table A
--------------
id
address
Run Code Online (Sandbox Code Playgroud)

现在我想获取该表的所有行,但对于具有相同地址的行,我只想获取一行(与哪个 id 无关)。我还想知道某个特定地址有多少个 id。因此,如果有两个人住在同一地址“主要街道”(假设 id=4 和 id=12),我希望得到这样的输出(“主要街道”,2),

这是我的开始尝试

query = models.A.query
query = query.add_columns(func.count(models.A.address)).all()
Run Code Online (Sandbox Code Playgroud)

然而,这给了我该表中的总行数。所以我猜 func.count 是错误的函数?预先感谢卡尔

python sqlalchemy flask-sqlalchemy

2
推荐指数
1
解决办法
4302
查看次数

sqlalchemy 对称多对一友谊

我正在尝试使用 SQLAlchemy ORM 建立友谊模型。我试图建模的关系是对称的。与 Facebook 类似,如果用户 a 要添加用户 b,则用户 b 必须批准该好友请求。我当前的模型如下。

class User(db.Model):
  __tablename__ = 'User'
  id = db.Column(db.Integer, primary_key=True)
  name = db.Column(db.String(35), unique=False)
  username = db.Column(db.String(25), index=True, unique=True)
  password = db.Column(db.String(35), unique=False)
  email = db.Column(db.String(35), unique=True)
  phone_number = db.Column(db.String(22))

  # define relationships
  requester = db.relationship('Relationship', foreign_keys='Relationship.requesting_user', backref='requester')
  receiver = db.relationship('Relationship', foreign_keys='Relationship.receiving_user', backref='received')

  def __repr__(self):
    return '<User %r>' % (self.username)


class Relationship(db.Model):
  __tablename__ = 'Relationship'
  id = db.Column(db.Integer, primary_key=True)
  requesting_user = db.Column(db.Integer, db.ForeignKey('User.id'))
  receiving_user = db.Column(db.Integer, db.ForeignKey("User.id"))
  status = db.Column(db.Integer) …
Run Code Online (Sandbox Code Playgroud)

sql postgresql sqlalchemy flask-sqlalchemy

2
推荐指数
1
解决办法
1140
查看次数

SQLAlchemy automap - 向自动映射模型添加方法

我有一个与 SQLAlchemy 一起使用的预先存在的数据库,因此我使用 automap 从数据库中获取模型。向这些类添加方法的最佳方法是什么?例如,对于 User 类,我想添加验证密码等方法。另外,我想添加烧瓶登录(UserMixin)方法的方法。

python sqlalchemy flask flask-sqlalchemy

2
推荐指数
1
解决办法
1601
查看次数

Alembic 未生成正确的更改

我在用Flask-Migrate==2.0.0。它无法正确检测更改。每次我跑步python manage db migrate,它都会为所有模型生成一个脚本,尽管它们已在之前的版本中成功添加。我已向表中添加了两个新列,迁移修订版应该只有这两个新列,而不是所有表都添加到其中。我有什么遗漏的吗?

编辑1

这是正在发生的事情。我将 Flask_Migrate 添加到我的项目中。

python manage db init
python manage db migrate
python manage db upgrade
Run Code Online (Sandbox Code Playgroud)

Flask-Migrate 为模型生成的表以及具有修订版的 alembic_version 表

985efbf37786

之后我做了一些改变。我在其中一个表中添加了两个新列并再次运行命令

python manage db migrate
Run Code Online (Sandbox Code Playgroud)

它生成了新的修订版

934ba2ddbd44

但修订版不是仅添加这两个新列,而是包含所有表以及这两个新列的脚本。例如,在我的第一次修订中,我有这样的内容

op.create_table('forex_costs',
sa.Column('code', sa.String(), nullable=False),
sa.Column('country', sa.String(), nullable=False),
sa.Column('rate', sa.Numeric(), nullable=False),
sa.PrimaryKeyConstraint('code', 'country', name='forex_costs_id'),
schema='regis'
)
Run Code Online (Sandbox Code Playgroud)

第二个修订版也包含完全相同的代码。我不明白为什么它已经生成了。

我用谷歌搜索了一下,我的问题看起来完全像这个https://github.com/miguelgrinberg/Flask-Migrate/issues/93,但我没有使用oracle DB。我正在使用 Postgresql。另外我不知道它是否有任何影响,但我没有在默认公共架构中创建表,而是创建两个新架构(schema_a 和 schema_b),因为我有很多表(大约 100 个)。所以只是为了安排他们。

编辑2

第一个问题似乎通过添加解决了

include_schemas=真

在 env.py 中。

现在,新的迁移不会尝试再次创建已经存在的表,但它存在一些外键问题。每次我创建新的修订版时,它都会尝试删除已经存在的外键,然后尝试添加它们。日志看起来像这样

INFO  [alembic.autogenerate.compare] Detected removed foreign key (post_id)(post_id) on table …
Run Code Online (Sandbox Code Playgroud)

postgresql flask flask-sqlalchemy alembic flask-migrate

2
推荐指数
1
解决办法
4511
查看次数

根据过滤器使用 sqlalchamey 选择特定列值

一直在摆弄 SQLalchemy 和 Flask,遇到了一个我找不到好的文档的问题。

我需要查询特定用户的电子邮件,但我无法找到过滤器的正确组合并选择特定列。

我试过了:

user = User.query.filter(User.username == currentuser).email

user = User.query(User.email).filter(User.username == currentuser)

user = User.query.filter(User.username == currentuser, User.email)

user = User.query.filter(User.email, User.username == currentuser)
Run Code Online (Sandbox Code Playgroud)

但我无法得到我想要的结果。

python mysql sqlalchemy flask flask-sqlalchemy

2
推荐指数
1
解决办法
6661
查看次数

具有多个连接的 SQLAlchemy 查询

我正在使用 SQLAlchemy 和 Postgres 创建一个 Flask 应用程序。我对此很陌生,所以我将不胜感激。然而,我的直接问题是在以下模型上构建查询。

from app import db
from sqlalchemy import or_, and_


# Items Table
class Item(db.Model):

    __tablename__ = "items"

    id = db.Column(db.Integer, primary_key=True)
    itemName = db.Column(db.String, unique=True, nullable=False)
    measurement = db.Column(db.String, nullable=False)
    defaultPrice = db.Column(db.Float, nullable=False)
    minimumOrder = db.Column(db.Float, nullable=False)
    maximumOrder = db.Column(db.Float, nullable=False)
    orders = db.relationship('Order', back_populates='item')
    prices = db.relationship('Price', back_populates='item')

    def __init__(self, itemName, measurement, defaultPrice,
                 minimumOrder, maximumOrder):
        self.itemName = itemName
        self.measurement = measurement
        self.defaultPrice = defaultPrice
        self.minimumOrder = minimumOrder
        self.maximumOrder = maximumOrder

    def …
Run Code Online (Sandbox Code Playgroud)

python postgresql sqlalchemy flask flask-sqlalchemy

2
推荐指数
1
解决办法
5607
查看次数

Python-Flask-SQLAlchemy 获取 ISO 格式的日期列

我有一个模型类,看起来像这样

class Test(database.Model):
       created_date = database.Column(database.DateTime,
                                      default=datetime.utcnow,
                                      nullable=False)
Run Code Online (Sandbox Code Playgroud)

我通过运行命令得到这个

all = Test.query.all()
Run Code Online (Sandbox Code Playgroud)

现在,这为我提供了格式的日期,2017-09-05 09:45:28我想获得日期的 ISO 表示形式,例如2017-09-05T09:45:28.263000.

一种选择是对收到的数据进行后处理,但更好的方法是什么?是否有任何 SQLAlchemy 构造可以帮助我实现这一目标?

python datetime sqlalchemy iso8601 flask-sqlalchemy

2
推荐指数
1
解决办法
2万
查看次数

带有连接列的 Flask SQLAlchemy 查询

我有一个这样的模型:

class User(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    first_name = db.Column(db.String(64), index=True)
    last_name = db.Column(db.String(64), index=True)
    
    def full_name(self):
        return '%s %s' % (self.first_name, self.last_name)
Run Code Online (Sandbox Code Playgroud)

我想full_name在查询中获取该方法,我像这样尝试:

user = db.session.query(User.full_name()).all()
Run Code Online (Sandbox Code Playgroud)

但我收到此错误消息:

TypeError: full_name() missing 1 required positional argument: 'self'
Run Code Online (Sandbox Code Playgroud)

然后我尝试调用不带括号的函数:

user = db.session.query(User.full_name).all()
Run Code Online (Sandbox Code Playgroud)

然后我收到此错误消息:

sqlalchemy.exc.InvalidRequestError: SQL expression, column, or mapped entity expected - got '<function User.full_name at 0x7f265960aae8>'
Run Code Online (Sandbox Code Playgroud)

那么,full_name()在 User 模型中查询方法的正确方法是什么..?

python sqlalchemy flask-sqlalchemy

2
推荐指数
1
解决办法
1779
查看次数

Flask-SQLAlchemy 多对多关系:如何插入数据

我在 Flask-Sqlalchemy 模型中创建了多对多关系。但是,我似乎不太了解如何填充我的数据库。你能告诉我我应该如何编写代码来正确填充我的数据库吗?

这是我的模型:

company_contact = db.Table('company_contact', db.Model.metadata,
    db.Column('company_id', Integer, ForeignKey('company.id')),
    db.Column('contact_id', Integer, ForeignKey('contact.id'))
)

class Company(db.Model):
    __tablename__ = 'company'

    id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    contacts = db.relationship('Contact', secondary=company_contact, back_populates="companies")
    company_name = db.Column(db.String(100))

    def __repr__(self):
        return '<Company {}{}>'.format(self.contacts, self.company_name)


class Contact(db.Model):
    __tablename__ = 'contact'

    id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    last_name = db.Column(db.String(255))
    first_name = db.Column(db.String(255))
    job_position = db.Column(db.String(255))
    companies = db.relationship('Company', secondary=company_contact, back_populates="contacts")
    contact_status = db.Column(db.Enum('Client', 'Prospect', 'Churner', 'Prestataire', 'Reperage',
                                       name='contact_status'))
    start_date = db.Column(db.DateTime, server_default=db.func.now())
    stop_date = db.Column(db.DateTime, default=None)

    def …
Run Code Online (Sandbox Code Playgroud)

python many-to-many sqlalchemy flask flask-sqlalchemy

2
推荐指数
1
解决办法
1794
查看次数

sqlalchemy.orm.exc.UnmappedInstanceError:类'builtins.dict'未映射

我正在尝试使用 SQLAlchemy 和 Marshmallow 将新用户插入到数据库中。该user参数是从 API 端点接收的。一切正常,直到我到达create函数中的这一行:

db.session.add(new_user)
Run Code Online (Sandbox Code Playgroud)

此时new_user变量的值是:

{'password': 'string', 'email': 'fave@string', 'username': 'string'}
Run Code Online (Sandbox Code Playgroud)

功能:

def create(user):
    uname = user.get('username')
    email = user.get('email')
    password = user.get ('password')

    existing_username = User.query.filter(User.username == uname).one_or_none()

    if existing_username is None:

        schema = UserSchema()
        new_user = schema.load(user, session=db.session)

        db.session.add(new_user) <- It fails here
        db.session.commit()

        return schema.dump(new_user), 201
Run Code Online (Sandbox Code Playgroud)

楷模:

    class User (db.Model):
        id = db.Column(db.Integer, primary_key=True)
        username = db.Column(db.String(20), unique=True, nullable=False)
        email = db.Column(db.String(120), unique=True, nullable=False)
        profile_picture = db.Column(db.String(20), …
Run Code Online (Sandbox Code Playgroud)

python sqlalchemy flask-sqlalchemy flask-marshmallow marshmallow-sqlalchemy

2
推荐指数
1
解决办法
5453
查看次数