Python 自定义ID烧瓶Sql炼金术

Python 自定义ID烧瓶Sql炼金术,python,sqlalchemy,flask-sqlalchemy,Python,Sqlalchemy,Flask Sqlalchemy,我正在尝试在表中创建自定义ID。我想要的身份证: 1909001 1909002 基本上格式是yymm+计数器,我想做一个查询来检查model类中的最后一个id。尝试使用此代码,但仍然没有成功 class Task(db.Model): task_id = db.Column(db.Integer, primary_key=True) subject = db.Column(db.String(100), nullable=False) request_dt = db.C

我正在尝试在表中创建自定义ID。我想要的身份证:

1909001 1909002

基本上格式是yymm+计数器,我想做一个查询来检查model类中的最后一个id。尝试使用此代码,但仍然没有成功

class Task(db.Model):
    task_id = db.Column(db.Integer, primary_key=True)
    subject = db.Column(db.String(100), nullable=False)
    request_dt = db.Column(db.DateTime, nullable=False)
    request_detail = db.Column(db.Text, nullable=False)
    requestor = db.Column(db.String(100), nullable=False)

    def get_last_id(self):
        ym = date.today().strftime("%y%m")
        qry = self.query.filter(self.task_id.like("{}".format(ym))).order_by(self.task_id.desc()).first()
        if qry.task_id == '':
            return ym + '001'
        else:
            lastid = qry.task_id
            return "{:02d}".format(int(lastid[-3:]) + 1)

    def __init__(self, subject, req_dt, req_detail, reqtor):
        self.task_id = self.get_last_id()
        self.subject = subject
        self.request_detail = req_detail
        self.request_dt = req_dt
        self.requestor = reqtor

我写了一个小烧瓶应用程序,可以帮助你回答你的问题

您将获得与您尝试获取的格式相同的自定义id

app.py

from datetime import datetime, date
from flask import Flask, render_template, request, redirect, url_for
from flask_migrate import Migrate
from flask_sqlalchemy import SQLAlchemy
from flask_wtf import FlaskForm, CSRFProtect
from sqlalchemy import desc
from wtforms import StringField, SubmitField

app = Flask(__name__)

app.config.from_pyfile('config.py')

app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
SQLALCHEMY_DATABASE_URI = app.config['SQLALCHEMY_DATABASE_URI']

app.config['SECRET_KEY'] = app.config['SECRET_KEY']

csrf = CSRFProtect(app)
WTF_CSRF_SECRET_KEY = app.config['SECRET_KEY']

db = SQLAlchemy(app)
migrate = Migrate(app, db)


class Task(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    custom_id = db.Column(db.String(), nullable=False)
    subject = db.Column(db.String(), nullable=False)
    request_detail = db.Column(db.String(), nullable=False)
    request_dt = db.Column(db.String(), nullable=False)
    request_or = db.Column(db.String(), nullable=False)
    date = db.Column(db.DateTime, nullable=False, default=datetime.utcnow)


    def get_last_id():

        qry = Task.query.order_by(Task.id.desc()).first()
        x = qry.id
        ym = date.today().strftime("%y%m")
        q_custom_id = "" + ym + str(x).zfill(3) + ""

        return q_custom_id


    def __init__(self, custom_id, subject, request_detail, request_dt, request_or):
        self.custom_id = custom_id
        self.subject = subject
        self.request_detail = request_detail
        self.request_dt = request_dt
        self.request_or = request_or


class TaskForm(FlaskForm):
    subject = StringField(u'subject')
    request_detail = StringField(u'request_detail')
    request_dt = StringField(u'request_dt')
    request_or = StringField(u'request_or')

    submit = SubmitField('Save Post')


@app.route('/')
def id_order_task():
    task_id = Task.query.order_by(Task.date.desc())
    return render_template('index.html', task_id=task_id)


@app.route('/set-task', methods=['GET', 'POST'])
def set_task():
    form = TaskForm()
    try:
        get_id = Task.query.order_by(desc('id')).first()
        x: int = get_id.id + 1
        y = date.today().strftime("%y%m")
        if get_id:
            custom_id = "" + y + str(x).zfill(3) + ""
    except:
        custom_id = str(date.today().strftime("%y%m") + str(1).zfill(3))
    finally:
        if request.method == 'POST':
            add_task = Task(
                custom_id=custom_id,
                subject=request.form['subject'],
                request_detail=request.form['request_detail'],
                request_dt=request.form['request_dt'],
                request_or=request.form['request_or']
            )
            db.session.add(add_task)
            db.session.commit()
            return redirect(url_for('id_order_task'))
    return render_template('set-task.html', form=form)


if __name__ == '__main__':
    app.run()
设置任务.html

<div>
    <form action="{{ url_for('set_task') }}" method="post">

        {{ form.csrf_token }}

        {{ form.subject.label }}
        {{ form.subject }}

        {{ form.request_detail.label }}
        {{ form.request_detail }}

        {{ form.request_dt.label }}
        {{ form.request_dt }}

        {{ form.request_or.label }}
        {{ form.request_or }}

        {{ form.submit }}
    </form>
</div>
<style>
table {
  border-collapse: collapse;
}
table, th, td {
  border: 1px solid black;
}
th, td {
  padding: 15px;
  text-align: left;
}
</style>

  <table>
     <thead>
        <tr>
           <th>id</th>
           <th>custom_id</th>
           <th>subject</th>
           <th>request_detail</th>
            <th>request_dt</th>
            <th>request_or</th>
            <th>date</th>
        </tr>
     </thead>
     <tbody>
        {% for i in task_id %}
           <tr>
              <td>{{ i.id }}</td>
              <td>{{ i.custom_id}}</td>
              <td>{{ i.subject }}</td>
              <td>{{ i.request_detail }}</td>
           <td>{{ i.request_dt }}</td>
              <td>{{ i.request_or }}</td>
              <td>{{ i.date }}</td>
           </tr>
        {% endfor %}
     </tbody>
  </table>

{{form.csrf_token}
{{form.subject.label}
{{form.subject}}
{{form.request_detail.label}
{{form.request_detail}
{{form.request_dt.label}
{{form.request_dt}}
{{form.request_或.label}
{{form.request_或}
{{form.submit}
index.html

<div>
    <form action="{{ url_for('set_task') }}" method="post">

        {{ form.csrf_token }}

        {{ form.subject.label }}
        {{ form.subject }}

        {{ form.request_detail.label }}
        {{ form.request_detail }}

        {{ form.request_dt.label }}
        {{ form.request_dt }}

        {{ form.request_or.label }}
        {{ form.request_or }}

        {{ form.submit }}
    </form>
</div>
<style>
table {
  border-collapse: collapse;
}
table, th, td {
  border: 1px solid black;
}
th, td {
  padding: 15px;
  text-align: left;
}
</style>

  <table>
     <thead>
        <tr>
           <th>id</th>
           <th>custom_id</th>
           <th>subject</th>
           <th>request_detail</th>
            <th>request_dt</th>
            <th>request_or</th>
            <th>date</th>
        </tr>
     </thead>
     <tbody>
        {% for i in task_id %}
           <tr>
              <td>{{ i.id }}</td>
              <td>{{ i.custom_id}}</td>
              <td>{{ i.subject }}</td>
              <td>{{ i.request_detail }}</td>
           <td>{{ i.request_dt }}</td>
              <td>{{ i.request_or }}</td>
              <td>{{ i.date }}</td>
           </tr>
        {% endfor %}
     </tbody>
  </table>

桌子{
边界塌陷:塌陷;
}
表,th,td{
边框:1px纯黑;
}
th,td{
填充:15px;
文本对齐:左对齐;
}
身份证件
自定义标识
主题
请求详细信息
请求
请求
日期
{task_id%中的i的%s}
{{i.id}
{{i.custom_id}
{{i.subject}}
{{i.request_detail}
{{i.request_dt}}
{{i.请求{u或}}
{{i.date}
{%endfor%}

我编写了一个小烧瓶应用程序,可以帮助你回答问题

您将获得与您尝试获取的格式相同的自定义id

app.py

from datetime import datetime, date
from flask import Flask, render_template, request, redirect, url_for
from flask_migrate import Migrate
from flask_sqlalchemy import SQLAlchemy
from flask_wtf import FlaskForm, CSRFProtect
from sqlalchemy import desc
from wtforms import StringField, SubmitField

app = Flask(__name__)

app.config.from_pyfile('config.py')

app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
SQLALCHEMY_DATABASE_URI = app.config['SQLALCHEMY_DATABASE_URI']

app.config['SECRET_KEY'] = app.config['SECRET_KEY']

csrf = CSRFProtect(app)
WTF_CSRF_SECRET_KEY = app.config['SECRET_KEY']

db = SQLAlchemy(app)
migrate = Migrate(app, db)


class Task(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    custom_id = db.Column(db.String(), nullable=False)
    subject = db.Column(db.String(), nullable=False)
    request_detail = db.Column(db.String(), nullable=False)
    request_dt = db.Column(db.String(), nullable=False)
    request_or = db.Column(db.String(), nullable=False)
    date = db.Column(db.DateTime, nullable=False, default=datetime.utcnow)


    def get_last_id():

        qry = Task.query.order_by(Task.id.desc()).first()
        x = qry.id
        ym = date.today().strftime("%y%m")
        q_custom_id = "" + ym + str(x).zfill(3) + ""

        return q_custom_id


    def __init__(self, custom_id, subject, request_detail, request_dt, request_or):
        self.custom_id = custom_id
        self.subject = subject
        self.request_detail = request_detail
        self.request_dt = request_dt
        self.request_or = request_or


class TaskForm(FlaskForm):
    subject = StringField(u'subject')
    request_detail = StringField(u'request_detail')
    request_dt = StringField(u'request_dt')
    request_or = StringField(u'request_or')

    submit = SubmitField('Save Post')


@app.route('/')
def id_order_task():
    task_id = Task.query.order_by(Task.date.desc())
    return render_template('index.html', task_id=task_id)


@app.route('/set-task', methods=['GET', 'POST'])
def set_task():
    form = TaskForm()
    try:
        get_id = Task.query.order_by(desc('id')).first()
        x: int = get_id.id + 1
        y = date.today().strftime("%y%m")
        if get_id:
            custom_id = "" + y + str(x).zfill(3) + ""
    except:
        custom_id = str(date.today().strftime("%y%m") + str(1).zfill(3))
    finally:
        if request.method == 'POST':
            add_task = Task(
                custom_id=custom_id,
                subject=request.form['subject'],
                request_detail=request.form['request_detail'],
                request_dt=request.form['request_dt'],
                request_or=request.form['request_or']
            )
            db.session.add(add_task)
            db.session.commit()
            return redirect(url_for('id_order_task'))
    return render_template('set-task.html', form=form)


if __name__ == '__main__':
    app.run()
设置任务.html

<div>
    <form action="{{ url_for('set_task') }}" method="post">

        {{ form.csrf_token }}

        {{ form.subject.label }}
        {{ form.subject }}

        {{ form.request_detail.label }}
        {{ form.request_detail }}

        {{ form.request_dt.label }}
        {{ form.request_dt }}

        {{ form.request_or.label }}
        {{ form.request_or }}

        {{ form.submit }}
    </form>
</div>
<style>
table {
  border-collapse: collapse;
}
table, th, td {
  border: 1px solid black;
}
th, td {
  padding: 15px;
  text-align: left;
}
</style>

  <table>
     <thead>
        <tr>
           <th>id</th>
           <th>custom_id</th>
           <th>subject</th>
           <th>request_detail</th>
            <th>request_dt</th>
            <th>request_or</th>
            <th>date</th>
        </tr>
     </thead>
     <tbody>
        {% for i in task_id %}
           <tr>
              <td>{{ i.id }}</td>
              <td>{{ i.custom_id}}</td>
              <td>{{ i.subject }}</td>
              <td>{{ i.request_detail }}</td>
           <td>{{ i.request_dt }}</td>
              <td>{{ i.request_or }}</td>
              <td>{{ i.date }}</td>
           </tr>
        {% endfor %}
     </tbody>
  </table>

{{form.csrf_token}
{{form.subject.label}
{{form.subject}}
{{form.request_detail.label}
{{form.request_detail}
{{form.request_dt.label}
{{form.request_dt}}
{{form.request_或.label}
{{form.request_或}
{{form.submit}
index.html

<div>
    <form action="{{ url_for('set_task') }}" method="post">

        {{ form.csrf_token }}

        {{ form.subject.label }}
        {{ form.subject }}

        {{ form.request_detail.label }}
        {{ form.request_detail }}

        {{ form.request_dt.label }}
        {{ form.request_dt }}

        {{ form.request_or.label }}
        {{ form.request_or }}

        {{ form.submit }}
    </form>
</div>
<style>
table {
  border-collapse: collapse;
}
table, th, td {
  border: 1px solid black;
}
th, td {
  padding: 15px;
  text-align: left;
}
</style>

  <table>
     <thead>
        <tr>
           <th>id</th>
           <th>custom_id</th>
           <th>subject</th>
           <th>request_detail</th>
            <th>request_dt</th>
            <th>request_or</th>
            <th>date</th>
        </tr>
     </thead>
     <tbody>
        {% for i in task_id %}
           <tr>
              <td>{{ i.id }}</td>
              <td>{{ i.custom_id}}</td>
              <td>{{ i.subject }}</td>
              <td>{{ i.request_detail }}</td>
           <td>{{ i.request_dt }}</td>
              <td>{{ i.request_or }}</td>
              <td>{{ i.date }}</td>
           </tr>
        {% endfor %}
     </tbody>
  </table>

桌子{
边界塌陷:塌陷;
}
表,th,td{
边框:1px纯黑;
}
th,td{
填充:15px;
文本对齐:左对齐;
}
身份证件
自定义标识
主题
请求详细信息
请求
请求
日期
{task_id%中的i的%s}
{{i.id}
{{i.custom_id}
{{i.subject}}
{{i.request_detail}
{{i.request_dt}}
{{i.请求{u或}}
{{i.date}
{%endfor%}

因此,基本上您可以返回id表单任务,只需将字符串添加在一起,然后zfill id即可

def get_last_id():
    qry = Task.query.order_by(Task.id.desc()).first()
    x = qry.id
    ym = date.today().strftime("%y%m")
    q_custom_id = "" + ym + str(x).zfill(3) + ""
    return q_custom_id

# print(Task.get_last_id())
我在数据库上有3个ID,这将打印最后一个,ID 3将变成:

1909003

我希望这对您有所帮助:p

因此基本上您可以返回id表单任务,只需将字符串添加到一起,然后zfill id

def get_last_id():
    qry = Task.query.order_by(Task.id.desc()).first()
    x = qry.id
    ym = date.today().strftime("%y%m")
    q_custom_id = "" + ym + str(x).zfill(3) + ""
    return q_custom_id

# print(Task.get_last_id())
我在数据库上有3个ID,这将打印最后一个,ID 3将变成:

1909003

我希望这能帮助您:p

如果一个月内有1000多个任务,会发生什么?你能详细说明一下你试图用这个结构化id字段解决的问题吗?我想这不会发生。基本上,我计划将团队中的任务分配从excel转移到基于web的。到目前为止,一个月最多只能完成10项任务。我不想改变传统的ID格式。如果一个月内有1000多个任务,会发生什么?你能详细说明一下你试图用这个结构化id字段解决的问题吗?我想这不会发生。基本上,我计划将团队中的任务分配从excel转移到基于web的。到目前为止,一个月最多只能完成10项任务。我不想更改旧的ID格式。嗨,蒂姆,谢谢你的代码。它起作用了!但是我只是想知道,我们可以在类任务中执行get_id(检查DB中的最后一个id)吗?嗨,Bimo,当我执行以下查询时,我得到了最后一个自定义id,我相信应该很容易添加到代码中
qry=Task.query.order\u by(Task.custom\u id.desc()).first()打印(qry.custom\u id)
您好,谢谢您的代码。它起作用了!但是我只是想知道,我们可以在类任务中执行get_id(检查DB中的最后一个id)吗?嗨,Bimo,当我执行以下查询时,我得到了最后一个自定义id,我相信应该很容易添加到代码中
qry=Task.query.order\u by(Task.custom\u id.desc()).first()打印(qry.custom\u id)