标签: flask-sqlalchemy

SQLAlchemy使用Association配置与self的多对多关系

我遇到了与模型本身配置多对多关系的问题.当我使用普通关系配置(即不使用Association对象)时,我可以配置自多对多关系.

在这种情况下,我必须在多对多表中记录一些额外的信息,所以我试图使用Association对象(PageLink)实现关系.

这是模型.

class PageLink(Base):
    '''
    Association table.
    '''
    __tablename__ = 'page_links'

    id = Column(Integer,primary_key=True)
    page_from = Column(Integer,ForeignKey('page.id'),primary_key=True)
    page_to = Column(Integer,ForeignKey('page.id'),primary_key=True)
    extra_col1 = Column(String(256),nullable=False)

class Page(Base):
    '''
    main table
    '''

    __tablename__ = 'page'

    id = Column(Integer,primary_key=True)
    name = Column(String(56),nullable=False)

    linked = relationship('PageLinks',backref='parent_page',
                          primaryjoin=id==PageLink.page_from,
                          secondaryjoin=id==PageLink.page_to)
Run Code Online (Sandbox Code Playgroud)

这种方法不起作用.我试过删除'secondaryjoin'关键字,但它不起作用.

非常感谢有关此事的任何帮助或建议.

谢谢你的阅读.

python orm sqlalchemy flask-sqlalchemy

3
推荐指数
1
解决办法
1855
查看次数

使用SQLAlchemy创建后自动递增非唯一ID

我的主要目标是使实施修订历史记录和日记更加容易。

我发现自己想知道是否有可能使用Flask-SQLAlchemy(或直接使用SQL)为mysql获取一个自动递增的非唯一整数。 我发现了这个堆栈溢出帖子,该帖子与我想做什么很接近,但问题集中在主键上。例如,如果我的表有这些列,

revision_id = db.Column(db.Integer, nullable=False)
post_id = db.Column(db.Integer, nullable=False)

__table_args__ = (
    PrimaryKeyConstraint('post_id', 'revision_id'),
)
Run Code Online (Sandbox Code Playgroud)

是否可以创建一个修订版本ID为1且post_id为max(post_id)+ 1的新帖子,而不会出现两个用户尝试同时创建一个帖子并创建相同的post_id的问题?

该系统的优势在于,它使发布历史记录(和差异记录)非常简单。每当有人想要修改帖子时,我都将使用与原始帖子相同的post_id并增加version_id(现在我将其键入,但存在相同的问题)。

更新:

西尔万·勒鲁(Sylvain Leroux)使我走上了正确的道路,以解决我的问题。我需要将两个表都设置为sqlalchemy中的主键。如果sqlalchemy中有一个以上的主键,则不会假定它们是唯一的。这是我目前的定义,

revision_id = db.Column(db.Integer, primary_key=True, nullable=False, autoincrement=False, default=1)
post_id = db.Column(db.Integer, primary_key=True, nullable=False, autoincrement=True)
__table_args__ = (
    PrimaryKeyConstraint('post_id', 'revision_id'),
)
Run Code Online (Sandbox Code Playgroud)

哪个产生这个SQL

CREATE TABLE `post` (
    revision_id INTEGER NOT NULL, 
    post_id INTEGER NOT NULL AUTO_INCREMENT, 
    PRIMARY KEY (post_id, revision_id), 
)
Run Code Online (Sandbox Code Playgroud)

这让我可以插入有无post_id的内容。

所有人都归功于Sylvain Leroux,因为我只是将他的答案翻译成了SQLAlchemy。

mysql sqlalchemy flask-sqlalchemy

3
推荐指数
1
解决办法
1947
查看次数

如何将默认的`db.Model`子类化为用SQLAlchemy作为自定义`Base`

我有一个烧瓶应用程序分布在带有蓝图的模块上.每个模块/蓝图都有自己的models.py文件,其中定义了模型.

随着我的桌面应用程序,直接使用SQLAlchemy的API,我将继承object定义Base了一些列的类(如:id,date_created...),然后将作为我的声明的基础(例如:Base = declarative_base(cls=Base)).

  • 我如何子类化flask-SQLALchemy,db.Model以便我可以将它用作默认列的Base,我希望所有表都有?

python sqlite sqlalchemy flask flask-sqlalchemy

3
推荐指数
1
解决办法
1535
查看次数

无法反映flask sqlalchemy中的数据库

我试图使用flask-sqlalchemy(烧瓶版本0.10,flask-sqlalch版本1.0,python 3.3.3)来反映我的数据库中的表并遇到错误.当我使用代码时:

from flask import Flask
from flask.ext.sqlalchemy import SQLAlchemy

app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql+mysqlconnector://**appropriate connection string here **'
db = SQLAlchemy(app)

db.reflect(app = app)
Run Code Online (Sandbox Code Playgroud)

得到以下错误:

file "testmodel.py", line 9, in (module)
db.reflect(app = app)
File "~pathToSqlAlch\flask_sqlalchemy\__init__.py", line 872, in reflect
self.execute_for_all_tables(app, bind, 'reflect')
File "~pathToSqlAlch\flask_sqlalchemy\__init__.py", line 848, in _execute_for_all_tables
op(bind=self.get_engine(app,bind), tables=tables)
reflect() got an unexpected keyword argument 'tables'
Run Code Online (Sandbox Code Playgroud)

任何想法可能导致这个或我可能做错了什么?

python flask python-3.x flask-sqlalchemy

3
推荐指数
1
解决办法
1281
查看次数

使用SQLAlchemy获取第一个和最后一个元素

在我的Python(Flask)代码中,我需要从SQLAlchemy查询中获取按给定变量排序的第一个元素和最后一个元素。

我首先编写了以下代码:

first_valuation = Valuation.query.filter_by(..).order_by(sqlalchemy.desc(Valuation.date)).first()
# Do some things
last_valuation = Valuation.query.filter_by(..).order_by(sqlalchemy.asc(Valuation.date)).first()
# Do other things
Run Code Online (Sandbox Code Playgroud)

由于这些查询对于PostgreSQL数据库可能很繁重,并且在我复制代码时,我认为只使用一个请求会更好,但是我不知道SQLAlchemy足以做到这一点...(当查询有效时)触发,例如?)

解决此问题的最佳方法是什么?

python database postgresql sqlalchemy flask-sqlalchemy

3
推荐指数
1
解决办法
6620
查看次数

将flask-sqlalchemy与pycharm一起使用

我正在使用pyCharm,并且一直在尝试安装sqlalchemy软件包以帮助我连接到我的mysql数据库。我跑了

pip install flask-sqlalchemy 
Run Code Online (Sandbox Code Playgroud)

下载一堆文件后,它成功完成了,但是当我这样做时,该库仍然不可用:

from flask.ext.sqlalchemy import SQLAlchemy
Run Code Online (Sandbox Code Playgroud)

我对python和所有这些东西还很陌生,我不知道该怎么做。安装flask很容易,因为pyCharm帮了我大忙,有什么办法可以做类似的事情吗?

编辑:通过打开pyCharm的首选项,然后转到Project Interpreter,它显示了所有已安装的模块,从而设法做到了这一点。然后只需单击底部的+按钮,然后搜索所需的模块即可。PyCharm从那时起为我做了一切。

python pycharm flask flask-sqlalchemy

3
推荐指数
2
解决办法
5473
查看次数

将数据库迁移从sqlalchemy-migrate更改为Flask-Migrate

我有一个基于miguel flask教程的Web应用程序

所以我使用sqlalchemy-migrate作为数据库,现在我应该在迁移中使用Alembic如何进行配置?有什么办法我可以从sqlalchemy-migrate更改为Flask-Migrate吗?(因为我的应用程序已经完成并且再次执行它是如此多的工作)Thanx

db_migrate.py:

#!flask/bin/python
import imp
from migrate.versioning import api
from app import db
from config import SQLALCHEMY_DATABASE_URI
from config import SQLALCHEMY_MIGRATE_REPO
migration = SQLALCHEMY_MIGRATE_REPO + '/versions/%03d_migration.py' % (api.db_version(SQLALCHEMY_DATABASE_URI, SQLALCHEMY_MIGRATE_REPO) + 1)
tmp_module = imp.new_module('old_model')
old_model = api.create_model(SQLALCHEMY_DATABASE_URI, SQLALCHEMY_MIGRATE_REPO)
exec old_model in tmp_module.__dict__
script = api.make_update_script_for_model(SQLALCHEMY_DATABASE_URI, SQLALCHEMY_MIGRATE_REPO, tmp_module.meta, db.metadata)
open(migration, "wt").write(script)
api.upgrade(SQLALCHEMY_DATABASE_URI, SQLALCHEMY_MIGRATE_REPO)
print 'New migration saved as ' + migration
print 'Current database version: ' + str(api.db_version(SQLALCHEMY_DATABASE_URI, SQLALCHEMY_MIGRATE_REPO))
Run Code Online (Sandbox Code Playgroud)

python data-migration flask-sqlalchemy alembic flask-migrate

3
推荐指数
1
解决办法
2332
查看次数

backref lazy ='dynamic' - 不支持对象填充 - 无法应用急切加载

我怎样才能PlanesBookings指定的两个日期之间.Bookings如果它们在2个日期之间,我需要将其过滤到仅包括在内.我试过这个,但得到错误:'Plane.bookings' does not support object population - eager loading cannot be applied.

为什么会出现此错误以及如何解决?

planes = (db.session.query(Plane)
             .join(Booking)
             .filter(Booking.start_date >= date)
             .options(contains_eager(Plane.bookings)))
Run Code Online (Sandbox Code Playgroud)

型号:

class Booking(db.Model):
        id = db.Column(db.Integer, primary_key=True)
        start_date = db.Column(db.DateTime)
        end_date = db.Column(db.DateTime)

        person_id = db.Column(db.Integer, db.ForeignKey('person.id'))
        person = db.relationship('Person', foreign_keys=[person_id], backref=db.backref('bookings', lazy='dynamic'))

        instructor_id = db.Column(db.Integer, db.ForeignKey('person.id'))
        instructor = db.relationship('Person', foreign_keys=[instructor_id], backref=db.backref('instructor_bookings', lazy='dynamic'))

        plane_id = db.Column(db.Integer, db.ForeignKey('plane.id'))
        plane = db.relationship('Plane', backref=db.backref('bookings', lazy='dynamic'))

        def __init__(self, start_date, end_date, plane_id, instructor_id, person_id):
            self.start_date = start_date …
Run Code Online (Sandbox Code Playgroud)

python sqlalchemy flask flask-sqlalchemy

3
推荐指数
1
解决办法
2480
查看次数

SQLAlchemy - 筛选查询,排除其中一个子符合条件的父项

我的SQL技能非常缺乏,所以我无法弄清楚如何形成我需要的查询.

我有两个具有一对多关系的db模型,定义如下:

class Parent(db.Model):
  __tablename__ = 'parent'

  id = db.Column(db.Integer, primary_key = True)

  children = db.relationship('Child', 
                             backref = 'parent', 
                             lazy = 'joined')

class Child(db.Model):
  __tablename__ = 'child'

  id = db.Column(db.Integer, primary_key = True)
  parent_id = db.Column(db.Integer, db.ForeignKey('parent.id'))

  value = db.Column(db.String(140))
Run Code Online (Sandbox Code Playgroud)

我希望能够形成一个查询,返回满足三个条件的所有父母:

1:有一个或多个孩子,其值包含'value1'

2:有一个或多个孩子,其值包含'value2'

3:没有孩子,其值包含'value3'或'value4'

对于此示例数据:

Parents:
id |
1  |
2  |
3  |
4  |

Children:
id | parent_id | value
1  | 1         | 'value1'
2  | 1         | 'value2'
3  | 1         | 'value3'
4  | 1 …
Run Code Online (Sandbox Code Playgroud)

python sqlalchemy flask-sqlalchemy

3
推荐指数
1
解决办法
1693
查看次数

执行flask-SQLAlchemy子查询

我想在flask-SQLAlchemy中执行以下子查询,但不知道如何:

SELECT * 
FROM (
     SELECT * 
     FROM  `articles` 
     WHERE publisher_id = "bild"
     ORDER BY date_time DESC 
     LIMIT 10
) AS t
ORDER BY RAND( ) 
LIMIT 2
Run Code Online (Sandbox Code Playgroud)

我知道我可以将查询构建为:

subq = Article.query.filter(Article.publisher_id =='bild').order_by(Article.date_time.desc()).limit(10).subquery()
qry = subq.select().order_by(func.rand()).limit(2)
Run Code Online (Sandbox Code Playgroud)

但是我不知道如何以与我执行相同的方式执行它,例如

articles = Article.query.filter(Article.publisher_id =='bild').all()
Run Code Online (Sandbox Code Playgroud)

即获取所有Article对象.我能做的就是打电话

db.session.execute(qry).fetchall()
Run Code Online (Sandbox Code Playgroud)

但这只给了我一个包含实际行值的列表,而不是我可以在其上调用另一个函数的对象(如article.to_json()).

有任何想法吗?qry是一个sqlalchemy.sql.selectable.Select对象,db.session.execute(qry)一个sqlalchemy.engine.result.ResultProxy同时Article.query,关于这一点我可以打电话all(),是一个flask_sqlalchemy.BaseQuery.谢谢!!

python mysql sqlalchemy flask-sqlalchemy

3
推荐指数
1
解决办法
2674
查看次数