我是 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 是错误的函数?预先感谢卡尔
我正在尝试使用 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) 我有一个与 SQLAlchemy 一起使用的预先存在的数据库,因此我使用 automap 从数据库中获取模型。向这些类添加方法的最佳方法是什么?例如,对于 User 类,我想添加验证密码等方法。另外,我想添加烧瓶登录(UserMixin)方法的方法。
我在用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) 一直在摆弄 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)
但我无法得到我想要的结果。
我正在使用 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) 我有一个模型类,看起来像这样
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 构造可以帮助我实现这一目标?
我有一个这样的模型:
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 模型中查询方法的正确方法是什么..?
我在 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) 我正在尝试使用 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
flask-sqlalchemy ×10
sqlalchemy ×9
python ×8
flask ×5
postgresql ×3
alembic ×1
datetime ×1
iso8601 ×1
many-to-many ×1
mysql ×1
sql ×1